{"openapi":"3.1.0","info":{"title":"VercelAI雷达 API","version":"1","description":"VercelAI 雷达的开放 API：读排行与仓库统计、登记仓库与发布项目、以及把新数据推到订阅者地址上。\n\n**每个端点都要 `Authorization: Bearer <key>`，没有任何免鉴权旁路。** 各自需要的 `scope` 写在每个端点的说明里；配额按 key 计（`user` 档 30 rpm / 1000 rpd，`service` 档 60 rpm / 5000 rpd）。\n\n接入说明、错误码表与 key 签发见站内 `/docs`；每个端点的交互式文档在 `/docs/api/`。"},"servers":[{"url":"https://www.vercelai.cn"}],"tags":[{"name":"读取 API","description":"`repos:read` / `rankings:read`：仓库档案、区间统计与指定周期的排行。"},{"name":"写入 API","description":"`repos:write` / `projects:write`：登记仓库、发布项目。写入 ≠ 对外可见。"},{"name":"订阅 API","description":"`subscriptions:write`：创建、改过滤器、暂停、轮换 secret、发探测事件。"},{"name":"扫描 API","description":"`skills:scan`：执行 Skill 安全扫描，返回规则与 LLM 结论。仅内部服务 key 可用。"}],"paths":{"/api/v1/repos/{id}":{"get":{"tags":["读取 API"],"operationId":"getRepo","summary":"仓库档案","x-nav-description":"单个仓库的档案，加上最近一期的日 / 周 / 月统计。","description":"单个仓库的档案，加上最近一期的日 / 周 / 月统计。最近一期取的是**已经存下来的最后一期**，不是昨天：采集任务随时可能停，按日历今天取会返回一串空洞，而空洞在图上和「这几天真的没人 star」无法区分（§4.1）。\n\n可见性与列表一致：公开可见，或这把 key 自己提交的。","parameters":[{"name":"id","in":"path","required":true,"description":"`repos.id`（nanoid），或 `owner/name`——后者要 URL 编码成 `owner%2Fname`","schema":{"type":"string"}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"档案与最近一期统计","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepoDetail"}}}},"400":{"description":"invalid_body：查询参数不合法（枚举值、范围或时间格式）","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"缺少 Authorization、key 已吊销（key_revoked）或已过期（key_expired）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"key 有效但没有这个接口要的 scope（insufficient_scope，需要 repos:read）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"key 查不到（not_found）。路由不存在也是这个响应","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"撞上分钟窗口或当天窗口的配额（rate_limited）","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"Ratelimit-Limit":{"$ref":"#/components/headers/Ratelimit-Limit"},"Ratelimit-Remaining":{"$ref":"#/components/headers/Ratelimit-Remaining"},"Ratelimit-Reset":{"$ref":"#/components/headers/Ratelimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/repos/{id}/stats":{"get":{"tags":["读取 API"],"operationId":"getRepoStats","summary":"仓库区间统计","x-nav-description":"日 / 周 / 月粒度的区间统计，窗口内不补洞。","description":"日 / 周 / 月三种粒度的区间统计，默认最近 90 天。\n\n两条必须知道的行为（§1.3 / §4.1）：\n\n- **不补洞**：窗口内没有采集的那些天直接不出现，不是 0。`null` 的含义是「这个周期没有采集」，转成 0 会变成「采集到 0」。\n- `end` 是该仓库**最新已存周期**，不 clamp 到今天。","parameters":[{"name":"id","in":"path","required":true,"description":"`repos.id`（nanoid），或 `owner/name`——后者要 URL 编码成 `owner%2Fname`","schema":{"type":"string"}},{"name":"cadence","in":"query","required":false,"description":"统计粒度","schema":{"type":"string","enum":["daily","weekly","monthly"],"default":"daily"}},{"name":"start","in":"query","required":false,"description":"区间起点，**`YYYY-MM-DD` 或完整 ISO 8601 时间戳**，按 Asia/Shanghai 日历解释。给日期时取当日 00:00 (+08:00)。缺省 `end - 90d`","schema":{"type":"string"}},{"name":"end","in":"query","required":false,"description":"区间终点，写法同 `start`。缺省该仓库最新已存周期","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"返回条数上限，缺省 500，最大 1000","schema":{"type":"integer","minimum":1,"maximum":1000}},{"name":"cursor","in":"query","required":false,"description":"上一页响应里的 `nextCursor`","schema":{"type":"string"}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"区间统计","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepoStatsRange"}}}},"400":{"description":"invalid_body：查询参数不合法（枚举值、范围或时间格式）","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"缺少 Authorization、key 已吊销（key_revoked）或已过期（key_expired）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"key 有效但没有这个接口要的 scope（insufficient_scope，需要 repos:read）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"key 查不到（not_found）。路由不存在也是这个响应","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"撞上分钟窗口或当天窗口的配额（rate_limited）","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"Ratelimit-Limit":{"$ref":"#/components/headers/Ratelimit-Limit"},"Ratelimit-Remaining":{"$ref":"#/components/headers/Ratelimit-Remaining"},"Ratelimit-Reset":{"$ref":"#/components/headers/Ratelimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/rankings/weekly":{"get":{"tags":["读取 API"],"operationId":"getWeeklyRankings","summary":"指定周排行","x-nav-description":"按 year / week 取指定周的榜单，缺省最近一个完整周。","description":"`year` / `week` 都不传时取**最近一个完整周期**，响应里的 `period` 会回显它——不回显的话，调用方无从知道自己拿到的到底是哪一期，而「静默地排了另一周」正是这条路要避免的（§5.1）。\n\n榜单部分沿用现有的 `Rankings`（`trending` + `byRelativeGrowth`），并额外带上 `period` 回显。响应带 `ETag` 与 `Cache-Control`，可以放心地条件请求。","parameters":[{"name":"year","in":"query","required":false,"description":"四位年份。缺省为最近一个完整周期","schema":{"type":"integer"}},{"name":"week","in":"query","required":false,"description":"ISO 周序号 1–53，给了它 year 才有意义","schema":{"type":"integer","minimum":1,"maximum":53}},{"name":"limit","in":"query","required":false,"description":"返回条数上限，缺省 100","schema":{"type":"integer","minimum":1}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"该周排行","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Rankings"}}}},"400":{"description":"invalid_body：查询参数不合法（枚举值、范围或时间格式）","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"缺少 Authorization、key 已吊销（key_revoked）或已过期（key_expired）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"key 有效但没有这个接口要的 scope（insufficient_scope，需要 rankings:read）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"key 查不到（not_found）。路由不存在也是这个响应","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"撞上分钟窗口或当天窗口的配额（rate_limited）","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"Ratelimit-Limit":{"$ref":"#/components/headers/Ratelimit-Limit"},"Ratelimit-Remaining":{"$ref":"#/components/headers/Ratelimit-Remaining"},"Ratelimit-Reset":{"$ref":"#/components/headers/Ratelimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/rankings/monthly":{"get":{"tags":["读取 API"],"operationId":"getMonthlyRankings","summary":"指定月排行","x-nav-description":"同一套逻辑，周期换成月。","description":"与周榜同一套逻辑，周期换成月。参数与缺省规则见 `/api/v1/rankings/weekly`。","parameters":[{"name":"year","in":"query","required":false,"description":"四位年份。缺省为最近一个完整周期","schema":{"type":"integer"}},{"name":"month","in":"query","required":false,"description":"月份 1–12","schema":{"type":"integer","minimum":1,"maximum":12}},{"name":"limit","in":"query","required":false,"description":"返回条数上限，缺省 100","schema":{"type":"integer","minimum":1}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"该月排行","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Rankings"}}}},"400":{"description":"invalid_body：查询参数不合法（枚举值、范围或时间格式）","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"缺少 Authorization、key 已吊销（key_revoked）或已过期（key_expired）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"key 有效但没有这个接口要的 scope（insufficient_scope，需要 rankings:read）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"key 查不到（not_found）。路由不存在也是这个响应","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"撞上分钟窗口或当天窗口的配额（rate_limited）","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"Ratelimit-Limit":{"$ref":"#/components/headers/Ratelimit-Limit"},"Ratelimit-Remaining":{"$ref":"#/components/headers/Ratelimit-Remaining"},"Ratelimit-Reset":{"$ref":"#/components/headers/Ratelimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/rankings/periods":{"get":{"tags":["读取 API"],"operationId":"listRankingPeriods","summary":"可用周期目录","x-nav-description":"先看哪些周 / 月有数据，再逐期取排行。","description":"先列目录、再逐期取排行，就不必猜哪些期存在。两种读法用同一组参数覆盖：\n\n- 给了 `year`：返回该年**有数据**的期，升序；\n- 不给 `year`：倒序返回最近若干期（默认 120）。\n\n**只列有数据的期**——列出一个没有行的周，等于把客户端送去拿一个必然 404 的请求。","parameters":[{"name":"year","in":"query","required":false,"description":"四位年份。给了就按该年升序返回；不给则倒序返回最近若干期","schema":{"type":"integer"}},{"name":"cadence","in":"query","required":false,"description":"周期类型","schema":{"type":"string","enum":["weekly","monthly"],"default":"weekly"}},{"name":"limit","in":"query","required":false,"description":"返回条数上限，缺省 120","schema":{"type":"integer","minimum":1}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"周期目录","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PeriodCatalog"}}}},"400":{"description":"invalid_body：查询参数不合法（枚举值、范围或时间格式）","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"缺少 Authorization、key 已吊销（key_revoked）或已过期（key_expired）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"key 有效但没有这个接口要的 scope（insufficient_scope，需要 rankings:read）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"key 查不到（not_found）。路由不存在也是这个响应","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"撞上分钟窗口或当天窗口的配额（rate_limited）","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"Ratelimit-Limit":{"$ref":"#/components/headers/Ratelimit-Limit"},"Ratelimit-Remaining":{"$ref":"#/components/headers/Ratelimit-Remaining"},"Ratelimit-Reset":{"$ref":"#/components/headers/Ratelimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/subscriptions":{"post":{"tags":["订阅 API"],"operationId":"createSubscription","summary":"创建订阅","x-nav-description":"让雷达每天把新数据推到你的地址。","description":"让 VercelAI 雷达每天把新数据推到你的地址上。投递**严格挂在两个排行任务都成功之后**，所以收到的数据不会缺尚未闭合的周期。\n\n三件事要先分清：\n\n- key 的 `subscriptions:write` 管「能不能创建/管理订阅」；订阅自己的 `scopes` 管「推什么」。投递时按订阅的 scope 读库，**不借用调用方 key 的权限**。\n- 这把 key 同时也是**签名 key**：验签密钥由它的 `key_hash` 派生（响应里的 `signingKey`），同 key 名下所有订阅共用一个，不需要按订阅分发第二个凭据。\n- 过滤器不是白名单语义而是「先命中即短路」，规则见 §6.6。","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionRequest"}}}},"responses":{"201":{"description":"订阅已创建。`signingKey` 是验签密钥，可随时从详情重取","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionCreated"}}}},"400":{"description":"invalid_body：请求体不符合 schema（filters 的枚举值、callbackUrl 不是 URL 等）","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"缺少 Authorization、key 已吊销（key_revoked）或已过期（key_expired）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"key 有效但没有这个接口要的 scope（insufficient_scope，需要 subscriptions:write）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"key 查不到（not_found）。路由不存在也是这个响应","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"撞上分钟窗口或当天窗口的配额（rate_limited）","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"Ratelimit-Limit":{"$ref":"#/components/headers/Ratelimit-Limit"},"Ratelimit-Remaining":{"$ref":"#/components/headers/Ratelimit-Remaining"},"Ratelimit-Reset":{"$ref":"#/components/headers/Ratelimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"get":{"tags":["订阅 API"],"operationId":"listSubscriptions","summary":"列出订阅","x-nav-description":"只列这把 key 自己的订阅。","description":"只返回**这把 key 自己**的订阅——归属是租户隔离的全部实现，没有别的过滤条件（§6.7）。列表带 `signingKeyPrefix`（签名 key 的前缀）而不是验签密钥本身，要密钥从详情取。","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"订阅列表","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionList"}}}},"400":{"description":"invalid_body：没有查询参数","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"缺少 Authorization、key 已吊销（key_revoked）或已过期（key_expired）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"key 有效但没有这个接口要的 scope（insufficient_scope，需要 subscriptions:write）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"key 查不到（not_found）。路由不存在也是这个响应","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"撞上分钟窗口或当天窗口的配额（rate_limited）","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"Ratelimit-Limit":{"$ref":"#/components/headers/Ratelimit-Limit"},"Ratelimit-Remaining":{"$ref":"#/components/headers/Ratelimit-Remaining"},"Ratelimit-Reset":{"$ref":"#/components/headers/Ratelimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/subscriptions/{id}":{"get":{"tags":["订阅 API"],"operationId":"getSubscription","summary":"订阅详情","x-nav-description":"单个订阅的命中数与最近 20 次投递。","description":"单个订阅 + 当前命中多少仓库 + 最近 20 条投递记录（`eventId` / `status` / `attempt` / `httpStatus` / `error`）。\n\n没有这段的话，订阅方唯一的排障手段就是「等明天看数据有没有更新」（§6.8）。\n\n`matchedRepos` 为 0 时，水位线既不推进也不回退：把水位线退到一个空集合的起点，等于让下一次投递重推全表（§6.4）。","parameters":[{"name":"id","in":"path","required":true,"description":"订阅 id（`subscriptions.id`）","schema":{"type":"string"}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"订阅详情","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionDetail"}}}},"400":{"description":"invalid_body：路径里的 id 不是合法订阅 id","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"缺少 Authorization、key 已吊销（key_revoked）或已过期（key_expired）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"key 有效但没有这个接口要的 scope（insufficient_scope，需要 subscriptions:write）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"key 查不到（not_found）。路由不存在也是这个响应","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"撞上分钟窗口或当天窗口的配额（rate_limited）","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"Ratelimit-Limit":{"$ref":"#/components/headers/Ratelimit-Limit"},"Ratelimit-Remaining":{"$ref":"#/components/headers/Ratelimit-Remaining"},"Ratelimit-Reset":{"$ref":"#/components/headers/Ratelimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"patch":{"tags":["订阅 API"],"operationId":"updateSubscription","summary":"改订阅","x-nav-description":"改过滤器 / scopes，或暂停恢复。","description":"改过滤器 / scopes、暂停或恢复。\n\n**改动过滤器时水位线会回退**：服务端在同一个事务里把 `filtersVersion` 加一，并把水位线退到「新命中集合的最早已存周期」，让新纳入的仓库至少被完整推一次——否则它们的历史早于水位线，就永远收不到。代价是已推过的数据可能重复一次，消费方靠 payload 里的 `filtersVersion` 区分「新数据」与「补发」（§6.4）。","parameters":[{"name":"id","in":"path","required":true,"description":"订阅 id（`subscriptions.id`）","schema":{"type":"string"}}],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionUpdate"}}}},"responses":{"200":{"description":"改后的订阅","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Subscription"}}}},"400":{"description":"invalid_body：请求体不符合 schema","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"缺少 Authorization、key 已吊销（key_revoked）或已过期（key_expired）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"key 有效但没有这个接口要的 scope（insufficient_scope，需要 subscriptions:write）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"key 查不到（not_found）。路由不存在也是这个响应","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"撞上分钟窗口或当天窗口的配额（rate_limited）","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"Ratelimit-Limit":{"$ref":"#/components/headers/Ratelimit-Limit"},"Ratelimit-Remaining":{"$ref":"#/components/headers/Ratelimit-Remaining"},"Ratelimit-Reset":{"$ref":"#/components/headers/Ratelimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"delete":{"tags":["订阅 API"],"operationId":"deleteSubscription","summary":"删除订阅","x-nav-description":"删订阅，并清空待投递队列。","description":"删除订阅，并清空它待投递的队列。已经投递出去的数据不会回收。","parameters":[{"name":"id","in":"path","required":true,"description":"订阅 id（`subscriptions.id`）","schema":{"type":"string"}}],"security":[{"bearerAuth":[]}],"responses":{"204":{"description":"已删除"},"400":{"description":"invalid_body：路径里的 id 不是合法订阅 id","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"缺少 Authorization、key 已吊销（key_revoked）或已过期（key_expired）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"key 有效但没有这个接口要的 scope（insufficient_scope，需要 subscriptions:write）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"key 查不到（not_found）。路由不存在也是这个响应","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"撞上分钟窗口或当天窗口的配额（rate_limited）","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"Ratelimit-Limit":{"$ref":"#/components/headers/Ratelimit-Limit"},"Ratelimit-Remaining":{"$ref":"#/components/headers/Ratelimit-Remaining"},"Ratelimit-Reset":{"$ref":"#/components/headers/Ratelimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/subscriptions/{id}/test":{"post":{"tags":["订阅 API"],"operationId":"testSubscription","summary":"发一条探测 payload","x-nav-description":"立刻发一条探测事件，验证回调与签名。","description":"立刻发一条 `subscription.test` 事件（内容极小，含一份真实的当前快照），用来验证回调地址可达、签名能过。\n\n**它不推进水位线**——补数据要等正常投递。鉴权与签名路径和正常投递完全一致，所以测试能验签通过，正常事件也能。","parameters":[{"name":"id","in":"path","required":true,"description":"订阅 id（`subscriptions.id`）","schema":{"type":"string"}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"投递结果","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionTest"}}}},"400":{"description":"invalid_body：路径里的 id 不是合法订阅 id","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"缺少 Authorization、key 已吊销（key_revoked）或已过期（key_expired）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"key 有效但没有这个接口要的 scope（insufficient_scope，需要 subscriptions:write）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"key 查不到（not_found）。路由不存在也是这个响应","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"撞上分钟窗口或当天窗口的配额（rate_limited）","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"Ratelimit-Limit":{"$ref":"#/components/headers/Ratelimit-Limit"},"Ratelimit-Remaining":{"$ref":"#/components/headers/Ratelimit-Remaining"},"Ratelimit-Reset":{"$ref":"#/components/headers/Ratelimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/openapi.json":{"get":{"tags":["读取 API"],"operationId":"getOpenapiDocument","summary":"接口自描述","x-nav-description":"需要凭据的 OpenAPI 3.1 契约副本。","description":"这份契约本身，**需要有效凭据**——加门是为了不把它当成免费的接口发现服务。返回的 spec 不含任何实例专属信息。\n\n同一个部署另外提供一个免鉴权的副本 `GET /openapi.json`（站内文档与 `llms.txt` 指向它）。两者内容同源，都由 `lib/openapi/document.ts` 聚合而成。","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"OpenAPI 3.1 文档","content":{"application/json":{"schema":{"type":"object","description":"OpenAPI 3.1 文档对象，结构见 https://spec.openapis.org/oas/v3.1.0"}}}},"401":{"description":"缺少 Authorization、key 已吊销（key_revoked）或已过期（key_expired）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"key 有效但没有这个接口要的 scope（insufficient_scope，需要 任意有效凭据）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"key 查不到（not_found）。路由不存在也是这个响应","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"撞上分钟窗口或当天窗口的配额（rate_limited）","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"Ratelimit-Limit":{"$ref":"#/components/headers/Ratelimit-Limit"},"Ratelimit-Remaining":{"$ref":"#/components/headers/Ratelimit-Remaining"},"Ratelimit-Reset":{"$ref":"#/components/headers/Ratelimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/repos":{"get":{"tags":["读取 API"],"operationId":"listRepos","summary":"列出仓库","x-nav-description":"列出这把 key 看得见的仓库及其命中原因。","description":"列出这把 key 可见的仓库，过滤器与订阅（§6.6）是**同一套语义**：判定按固定顺序短路求值，`repoIds` 非空时完全绕过其余规则。响应带上分类四轴，调用方可以自己验一遍「为什么这个仓库命中了」。\n\n可见范围是「公开可见 + 这把 key 自己提交的」，不含任何用户的私有列表。\n\n分页是 **keyset**（§3.7）：`cursor` 是上一页 响应里的 `nextCursor`，**坏的游标返回 400 而不是退回第一页**——静默退回会让调用方 以为数据只有一页。`total` 是命中过滤器的总数，与 `limit` 无关。","parameters":[{"name":"repoIds","in":"query","required":false,"description":"显式白名单，逗号分隔。给了就完全覆盖其余过滤器。逗号分隔，如 `V1StGXR8Z5jd`","schema":{"type":"string"}},{"name":"projectTypes","in":"query","required":false,"description":"项目形态（`projects.type`）。逗号分隔，如 `client,server,application,skill,persona`","schema":{"type":"string"}},{"name":"categoryCodes","in":"query","required":false,"description":"运营分类（`categories.code`），与形态正交。逗号分隔，如 `mcp-server`","schema":{"type":"string"}},{"name":"includePlatformProjects","in":"query","required":false,"description":"是否纳入有未隐藏 project 行的仓库","schema":{"type":"boolean"}},{"name":"includeUncurated","in":"query","required":false,"description":"是否纳入还没有 project 行的候选仓库。**缺省按条件推导**：projectTypes / categoryCodes 全空时为 true，按类型过滤时为 false——所以「按形态订阅」默认拿不到未策展的仓库，想要更宽的范围要显式写 true（设计文档 §6.6 陷阱一）","schema":{"type":"boolean"}},{"name":"includeOwnSubmissions","in":"query","required":false,"description":"是否纳入这把 key 自己提交过的仓库。缺省 true","schema":{"type":"boolean"}},{"name":"limit","in":"query","required":false,"description":"返回条数上限，缺省 50，最大 500","schema":{"type":"integer","minimum":1,"maximum":500}},{"name":"cursor","in":"query","required":false,"description":"上一页响应里的 `nextCursor`","schema":{"type":"string"}}],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"命中的一页。`nextCursor` 为 `null` 表示这是最后一页，`total` 是命中总数","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepoList"}}}},"400":{"description":"invalid_body：查询参数不合法（枚举值、范围或时间格式）","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"缺少 Authorization、key 已吊销（key_revoked）或已过期（key_expired）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"key 有效但没有这个接口要的 scope（insufficient_scope，需要 repos:read）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"key 查不到（not_found）。路由不存在也是这个响应","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"撞上分钟窗口或当天窗口的配额（rate_limited）","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"Ratelimit-Limit":{"$ref":"#/components/headers/Ratelimit-Limit"},"Ratelimit-Remaining":{"$ref":"#/components/headers/Ratelimit-Remaining"},"Ratelimit-Reset":{"$ref":"#/components/headers/Ratelimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}},"post":{"tags":["写入 API"],"operationId":"registerRepo","summary":"登记仓库","x-nav-description":"让雷达开始跟踪一个仓库，不发布。","description":"让雷达开始跟踪一个仓库，**不发布**。请求体只有两种形态，都是「给我一个地址」：`{ url }`（一整个 GitHub 地址）或 `{ repo }`（裸 `owner/repo`），两者都可选地带 `callbackUrl` + `callbackSecret`。**不接受调用方带来的 GitHub 数据**：那份星标数、语言、topics 是调用方某一时刻的快照，落库等于让统计建立在一个可能过期的副本上，服务端自己去取。按仓库去重：重发同一地址是安全的，返回 `created: false`。带 `type` 的请求会被 400 拒绝并指向 `POST /api/v1/projects`。最长 60 秒（要去 GitHub 抓数据）。\n\n给了 `Idempotency-Key` 就启用幂等（§3.3），成功的响应会被记住并逐次回放；不带也不产生重复行。","security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"客户端生成的稳定字符串（建议 uuid）。给了就启用幂等：同 key + 同请求体回放上次的状态码与响应体（响应体按 JSON 语义相同，键序可能与首次不同）；同 key + 不同请求体 409 `idempotency_key_reuse`；同 key 的另一个请求仍在跑 409 `idempotency_in_flight` + `Retry-After`。只有成功会被记住，24 小时后过期。超过 200 字符视作未带","schema":{"type":"string","maxLength":200}}],"requestBody":{"required":true,"description":"两种形态二选一，都是严格校验，多一个字段整条拒绝：`{ url }` 或 `{ repo: \"owner/repo\" }`。回调参数在两种形态下都可用——给了 `callbackUrl` 就必须给 `callbackSecret`，两者成对出现。","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepoRegisterRequest"}}}},"responses":{"200":{"description":"这个仓库本来就在跟踪里，本次只是刷新","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepoRegistered"}}}},"201":{"description":"新登记，或幂等回放了上次同一个 key 的成功响应（回放保留首次的状态码，所以也是 201）","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepoRegistered"}}}},"400":{"description":"invalid_body / invalid_url / type_not_accepted：不是合法 JSON、字段不符合 schema、不是 GitHub 仓库地址，或带了 `type`","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"缺少 Authorization、key 已吊销（key_revoked）或已过期（key_expired）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"key 有效但没有这个接口要的 scope（insufficient_scope，需要 repos:write）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"key 查不到（not_found）。路由不存在也是这个响应","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"409":{"description":"idempotency_key_reuse / idempotency_in_flight：同一个 Idempotency-Key 配了不同的请求体（换仓库请换 key），或同一个 key 的请求正在处理中（按 `Retry-After` 稍后重试即可拿到回放）","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"撞上分钟窗口或当天窗口的配额（rate_limited）","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"Ratelimit-Limit":{"$ref":"#/components/headers/Ratelimit-Limit"},"Ratelimit-Remaining":{"$ref":"#/components/headers/Ratelimit-Remaining"},"Ratelimit-Reset":{"$ref":"#/components/headers/Ratelimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"这个部署没配 GitHub 凭据（github_unavailable）","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/projects":{"post":{"tags":["写入 API"],"operationId":"publishProject","summary":"发布项目","x-nav-description":"把仓库策展成 project，放到公开站上。","description":"把一个仓库策展成 project，也就是放到公开站上。地址同样有两种写法：`{ url }` 或 `{ repo: \"owner/repo\" }`，加可选的 `type`（缺省 `application`）与回调参数。`projects:write` 不在自助签发范围内，需要管理员逐把 key 开。按仓库去重，返回 `status: \"existing\"`。最长 300 秒（要拉 README、翻译技能文档并投递）。","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"description":"`url` 与 `repo` 二选一；`type` 缺省 `application`；回调参数与登记端点相同","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectRequest"}}}},"responses":{"200":{"description":"这个仓库早就发布过（幂等命中）","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreated"}}}},"201":{"description":"新建了一个项目","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreated"}}}},"400":{"description":"invalid_body / invalid_url：不是合法 JSON、地址缺失、两种形态都没给，或只给了 `callbackUrl` 没给 `callbackSecret`","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"缺少 Authorization、key 已吊销（key_revoked）或已过期（key_expired）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"key 有效但没有这个接口要的 scope（insufficient_scope，需要 projects:write）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"key 查不到（not_found）。路由不存在也是这个响应","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"撞上分钟窗口或当天窗口的配额（rate_limited）","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"Ratelimit-Limit":{"$ref":"#/components/headers/Ratelimit-Limit"},"Ratelimit-Remaining":{"$ref":"#/components/headers/Ratelimit-Remaining"},"Ratelimit-Reset":{"$ref":"#/components/headers/Ratelimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"502":{"description":"创建 project 失败（create_failed），可以重试","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"503":{"description":"这个部署没配 GitHub 凭据（github_unavailable）","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}},"/api/v1/skills/scan":{"post":{"tags":["扫描 API"],"operationId":"scanSkill","summary":"执行 Skill 安全扫描","x-nav-description":"对 owner/repo（可指定 ref 与子目录）跑一遍规则 + LLM 复核。","description":"给内部服务用的端点：`skills:scan` 只配给 Web 侧的服务 key，不在任何自助签发范围内。请求**只带地址、不带文件**——源码由 Console 自己取，这样同一个提交在任何一次扫描里都得到同一个结论。规则在仓库所属环境里执行（Vercel Sandbox 或本地 clone），`source` 字段回传实际执行位置。最长 300 秒。","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"description":"`repoFullName` 必填；`ref` / `skillDir` / `includeLlm` 可选，`includeLlm` 缺省 true","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillScanRequest"}}}},"responses":{"200":{"description":"扫描完成","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillScanResponse"}}}},"400":{"description":"invalid_body / invalid_skill_dir：不是合法 JSON、`repoFullName` 缺失或不是 `owner/repo`，或 `skillDir` 越出仓库（后者是恶意调用）","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"401":{"description":"缺少 Authorization、key 已吊销（key_revoked）或已过期（key_expired）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"403":{"description":"key 有效但没有这个接口要的 scope（insufficient_scope，需要 skills:scan）","headers":{"WWW-Authenticate":{"description":"Bearer challenge","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"404":{"description":"key 查不到（not_found）。路由不存在也是这个响应","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"429":{"description":"撞上分钟窗口或当天窗口的配额（rate_limited）","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"Ratelimit-Limit":{"$ref":"#/components/headers/Ratelimit-Limit"},"Ratelimit-Remaining":{"$ref":"#/components/headers/Ratelimit-Remaining"},"Ratelimit-Reset":{"$ref":"#/components/headers/Ratelimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}},"502":{"description":"source_unavailable / scan_failed —— 仓库取不到或扫描执行失败，可重试","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"mcp_radar_<prefix>_<secret>","description":"`Authorization: Bearer <key>`。key 由控制台自助签发，或管理员在 /dashboard 代签"}},"headers":{"Ratelimit-Limit":{"description":"当前窗口的上限（分钟窗口与日窗口里更紧的那个）","schema":{"type":"integer"}},"Ratelimit-Remaining":{"description":"当前窗口剩余次数","schema":{"type":"integer"}},"Ratelimit-Reset":{"description":"配额恢复那一刻的 epoch 秒（绝对时间，不是倒计时）","schema":{"type":"integer"}},"Retry-After":{"description":"429 时需要等待的秒数；日窗口时可能是几小时","schema":{"type":"integer"}}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"稳定的错误码，判断分支只应依赖它"},"message":{"type":"string","description":"给人看的说明，可以改"},"detail":{"description":"补充信息，例如 schema 的第一个问题","type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false},"RepoUrlRegister":{"type":"object","properties":{"url":{"type":"string","minLength":1},"callbackUrl":{"description":"落库完成后回调一次的地址。成功与幂等命中都会回调；请求本身非法时直接返回错误，不回调","type":"string","format":"uri"},"callbackSecret":{"description":"回调签名密钥，至少 16 字节熵。给了 callbackUrl 就必须给，否则 400","type":"string","minLength":16}},"required":["url"],"additionalProperties":false},"RepoSlugRegister":{"type":"object","properties":{"repo":{"type":"string","minLength":3,"description":"`owner/name`，正好一个斜杠"},"callbackUrl":{"description":"落库完成后回调一次的地址。成功与幂等命中都会回调；请求本身非法时直接返回错误，不回调","type":"string","format":"uri"},"callbackSecret":{"description":"回调签名密钥，至少 16 字节熵。给了 callbackUrl 就必须给，否则 400","type":"string","minLength":16}},"required":["repo"],"additionalProperties":false},"RepoRegisterRequest":{"anyOf":[{"type":"object","properties":{"url":{"type":"string","minLength":1},"callbackUrl":{"description":"落库完成后回调一次的地址。成功与幂等命中都会回调；请求本身非法时直接返回错误，不回调","type":"string","format":"uri"},"callbackSecret":{"description":"回调签名密钥，至少 16 字节熵。给了 callbackUrl 就必须给，否则 400","type":"string","minLength":16}},"required":["url"],"additionalProperties":false},{"type":"object","properties":{"repo":{"type":"string","minLength":3,"description":"`owner/name`，正好一个斜杠"},"callbackUrl":{"description":"落库完成后回调一次的地址。成功与幂等命中都会回调；请求本身非法时直接返回错误，不回调","type":"string","format":"uri"},"callbackSecret":{"description":"回调签名密钥，至少 16 字节熵。给了 callbackUrl 就必须给，否则 400","type":"string","minLength":16}},"required":["repo"],"additionalProperties":false}]},"ProjectRequest":{"type":"object","properties":{"url":{"description":"形态一：GitHub 仓库地址","type":"string","minLength":1},"repo":{"description":"形态二：`owner/name`","type":"string","minLength":3},"type":{"type":"string","enum":["client","server","application","skill","persona"]},"callbackUrl":{"description":"落库完成后回调一次的地址。成功与幂等命中都会回调；请求本身非法时直接返回错误，不回调","type":"string","format":"uri"},"callbackSecret":{"description":"回调签名密钥，至少 16 字节熵。给了 callbackUrl 就必须给，否则 400","type":"string","minLength":16}},"additionalProperties":false},"RepoRegistered":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"repo":{"type":"object","properties":{"id":{"type":"string"},"full_name":{"type":"string"},"stars":{"description":"尚未采集到星标数时为 null","type":["number","null"]}},"required":["id","full_name","stars"],"additionalProperties":false},"created":{"type":"boolean","description":"true = 新登记，false = 这个仓库本来就在跟踪"},"projectCount":{"type":"number","description":"已发布的项目数。非零意味着这个仓库先前被策展过，本次的 type 被忽略"}},"required":["ok","repo","created","projectCount"],"additionalProperties":false},"ProjectCreated":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"status":{"type":"string","enum":["created","existing"]},"repo":{"type":"object","properties":{"full_name":{"type":"string"}},"required":["full_name"],"additionalProperties":false},"project":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"type":{"type":"string","enum":["client","server","application","skill","persona"]},"status":{"type":"string"},"description":{"type":"string"}},"required":["id","name","slug","type","status","description"],"additionalProperties":false},"readme":{"type":"object","properties":{"synced":{"type":"boolean"},"error":{"type":"string"}},"required":["synced"],"additionalProperties":false},"skills":{"anyOf":[{"type":"object","properties":{"count":{"type":"number"},"translated":{"type":"number"},"empty":{"type":"boolean"}},"required":["count","translated","empty"],"additionalProperties":false},{"type":"null"}],"description":"只有 type=skill 才同步技能文档；其余类型为 null"},"authorLinked":{"type":"boolean"},"delivered":{"description":"null = 这个部署没配下游，不是失败","type":["boolean","null"]},"delivery":{"type":"object","properties":{"found":{"type":"number"},"pushed":{"type":"number"},"failed":{"type":"number"}},"required":["found","pushed","failed"],"additionalProperties":false}},"required":["ok","status","repo","project","readme","skills","authorLinked","delivered"],"additionalProperties":false},"RankedAnomaly":{"type":"object","properties":{"kind":{"type":"string","enum":["star_cliff","star_acceleration","release_stall","commit_stall","license_change"]},"severity":{"type":"string","enum":["down","risk","notice","good"]},"title":{"type":"string"}},"required":["kind","severity","title"],"additionalProperties":false},"RankedProject":{"type":"object","properties":{"name":{"type":"string"},"fullName":{"type":"string"},"description":{"type":"string"},"stars":{"type":"number"},"delta":{"type":"number","description":"本周期内新增的星标数"},"relativeGrowth":{"description":"周期前星标数为 0 时为 null，而不是 Infinity","type":["number","null"]},"tags":{"type":"array","items":{"type":"string"}},"ownerId":{"type":"number"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},"logo":{"type":["string","null"]},"iconUrl":{"type":["string","null"]},"avatar":{"type":["string","null"]},"anomaly":{"anyOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["star_cliff","star_acceleration","release_stall","commit_stall","license_change"]},"severity":{"type":"string","enum":["down","risk","notice","good"]},"title":{"type":"string"}},"required":["kind","severity","title"],"additionalProperties":false},{"type":"null"}]}},"required":["name","fullName","description","stars","delta","relativeGrowth","tags","ownerId","createdAt","logo","iconUrl","avatar","anomaly"],"additionalProperties":false},"Rankings":{"type":"object","properties":{"period":{"type":"string","enum":["week","month"]},"year":{"type":"number"},"week":{"type":"number"},"month":{"type":"number"},"trending":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"fullName":{"type":"string"},"description":{"type":"string"},"stars":{"type":"number"},"delta":{"type":"number","description":"本周期内新增的星标数"},"relativeGrowth":{"description":"周期前星标数为 0 时为 null，而不是 Infinity","type":["number","null"]},"tags":{"type":"array","items":{"type":"string"}},"ownerId":{"type":"number"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},"logo":{"type":["string","null"]},"iconUrl":{"type":["string","null"]},"avatar":{"type":["string","null"]},"anomaly":{"anyOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["star_cliff","star_acceleration","release_stall","commit_stall","license_change"]},"severity":{"type":"string","enum":["down","risk","notice","good"]},"title":{"type":"string"}},"required":["kind","severity","title"],"additionalProperties":false},{"type":"null"}]}},"required":["name","fullName","description","stars","delta","relativeGrowth","tags","ownerId","createdAt","logo","iconUrl","avatar","anomaly"],"additionalProperties":false},"description":"按 delta 降序，最多 100 条"},"byRelativeGrowth":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"fullName":{"type":"string"},"description":{"type":"string"},"stars":{"type":"number"},"delta":{"type":"number","description":"本周期内新增的星标数"},"relativeGrowth":{"description":"周期前星标数为 0 时为 null，而不是 Infinity","type":["number","null"]},"tags":{"type":"array","items":{"type":"string"}},"ownerId":{"type":"number"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},"logo":{"type":["string","null"]},"iconUrl":{"type":["string","null"]},"avatar":{"type":["string","null"]},"anomaly":{"anyOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["star_cliff","star_acceleration","release_stall","commit_stall","license_change"]},"severity":{"type":"string","enum":["down","risk","notice","good"]},"title":{"type":"string"}},"required":["kind","severity","title"],"additionalProperties":false},{"type":"null"}]}},"required":["name","fullName","description","stars","delta","relativeGrowth","tags","ownerId","createdAt","logo","iconUrl","avatar","anomaly"],"additionalProperties":false}}},"required":["period","year","trending","byRelativeGrowth"],"additionalProperties":false},"Classification":{"type":"object","properties":{"projectTypes":{"type":"array","items":{"type":"string","enum":["client","server","application","skill","persona"]},"description":"该仓库所有已发布项目的 type，可能多个；未策展时为空数组"},"categoryCode":{"description":"categories.code；未策展时为 null","type":["string","null"]},"categoryReviewed":{"type":"boolean","description":"分类是否已由运营确认，未策展时为 false"},"isPlatformProject":{"type":"boolean","description":"是否存在未被隐藏的 project 行（公开页据此判定可见）"},"platformStatus":{"type":"string","enum":["pending","tracked","curated","archived"]},"tags":{"type":"array","items":{"type":"string"},"description":"公开站 /categories 的唯一分类轴"}},"required":["projectTypes","categoryCode","categoryReviewed","isPlatformProject","platformStatus","tags"],"additionalProperties":false},"RepoListItem":{"type":"object","properties":{"id":{"type":"string","description":"repos.id（nanoid），也可以直接当 {id} 传给详情与统计"},"fullName":{"type":"string","description":"`owner/name`"},"description":{"type":["string","null"]},"repoUrl":{"type":"string"},"topics":{"type":"array","items":{"type":"string"}},"languages":{"type":"array","items":{"type":"string"}},"licenseSpdxId":{"type":["string","null"]},"stars":{"description":"尚未采集到星标数时为 null","type":["number","null"]},"forks":{"type":["number","null"]},"subscribersCount":{"description":"GitHub 的 watch（通知订阅）人数，不是 star 数——两个词在 GitHub API 里含义相反","type":["number","null"]},"openIssuesCount":{"type":["number","null"]},"defaultBranch":{"type":["string","null"]},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},"pushedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},{"type":"null"}]},"lastCommit":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},{"type":"null"}]},"classification":{"type":"object","properties":{"projectTypes":{"type":"array","items":{"type":"string","enum":["client","server","application","skill","persona"]},"description":"该仓库所有已发布项目的 type，可能多个；未策展时为空数组"},"categoryCode":{"description":"categories.code；未策展时为 null","type":["string","null"]},"categoryReviewed":{"type":"boolean","description":"分类是否已由运营确认，未策展时为 false"},"isPlatformProject":{"type":"boolean","description":"是否存在未被隐藏的 project 行（公开页据此判定可见）"},"platformStatus":{"type":"string","enum":["pending","tracked","curated","archived"]},"tags":{"type":"array","items":{"type":"string"},"description":"公开站 /categories 的唯一分类轴"}},"required":["projectTypes","categoryCode","categoryReviewed","isPlatformProject","platformStatus","tags"],"additionalProperties":false},"projectCount":{"type":"number"}},"required":["id","fullName","description","repoUrl","topics","languages","licenseSpdxId","stars","forks","subscribersCount","openIssuesCount","defaultBranch","archived","createdAt","pushedAt","lastCommit","classification","projectCount"],"additionalProperties":false},"RepoList":{"type":"object","properties":{"repos":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"repos.id（nanoid），也可以直接当 {id} 传给详情与统计"},"fullName":{"type":"string","description":"`owner/name`"},"description":{"type":["string","null"]},"repoUrl":{"type":"string"},"topics":{"type":"array","items":{"type":"string"}},"languages":{"type":"array","items":{"type":"string"}},"licenseSpdxId":{"type":["string","null"]},"stars":{"description":"尚未采集到星标数时为 null","type":["number","null"]},"forks":{"type":["number","null"]},"subscribersCount":{"description":"GitHub 的 watch（通知订阅）人数，不是 star 数——两个词在 GitHub API 里含义相反","type":["number","null"]},"openIssuesCount":{"type":["number","null"]},"defaultBranch":{"type":["string","null"]},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},"pushedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},{"type":"null"}]},"lastCommit":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},{"type":"null"}]},"classification":{"type":"object","properties":{"projectTypes":{"type":"array","items":{"type":"string","enum":["client","server","application","skill","persona"]},"description":"该仓库所有已发布项目的 type，可能多个；未策展时为空数组"},"categoryCode":{"description":"categories.code；未策展时为 null","type":["string","null"]},"categoryReviewed":{"type":"boolean","description":"分类是否已由运营确认，未策展时为 false"},"isPlatformProject":{"type":"boolean","description":"是否存在未被隐藏的 project 行（公开页据此判定可见）"},"platformStatus":{"type":"string","enum":["pending","tracked","curated","archived"]},"tags":{"type":"array","items":{"type":"string"},"description":"公开站 /categories 的唯一分类轴"}},"required":["projectTypes","categoryCode","categoryReviewed","isPlatformProject","platformStatus","tags"],"additionalProperties":false},"projectCount":{"type":"number"}},"required":["id","fullName","description","repoUrl","topics","languages","licenseSpdxId","stars","forks","subscribersCount","openIssuesCount","defaultBranch","archived","createdAt","pushedAt","lastCommit","classification","projectCount"],"additionalProperties":false}},"nextCursor":{"type":["string","null"]},"total":{"type":"number","description":"命中过滤器的仓库总数，与 limit 无关"}},"required":["repos","nextCursor","total"],"additionalProperties":false},"RepoDetail":{"type":"object","properties":{"repo":{"type":"object","properties":{"id":{"type":"string","description":"repos.id（nanoid），也可以直接当 {id} 传给详情与统计"},"fullName":{"type":"string","description":"`owner/name`"},"description":{"type":["string","null"]},"repoUrl":{"type":"string"},"topics":{"type":"array","items":{"type":"string"}},"languages":{"type":"array","items":{"type":"string"}},"licenseSpdxId":{"type":["string","null"]},"stars":{"description":"尚未采集到星标数时为 null","type":["number","null"]},"forks":{"type":["number","null"]},"subscribersCount":{"description":"GitHub 的 watch（通知订阅）人数，不是 star 数——两个词在 GitHub API 里含义相反","type":["number","null"]},"openIssuesCount":{"type":["number","null"]},"defaultBranch":{"type":["string","null"]},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},"pushedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},{"type":"null"}]},"lastCommit":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},{"type":"null"}]},"classification":{"type":"object","properties":{"projectTypes":{"type":"array","items":{"type":"string","enum":["client","server","application","skill","persona"]},"description":"该仓库所有已发布项目的 type，可能多个；未策展时为空数组"},"categoryCode":{"description":"categories.code；未策展时为 null","type":["string","null"]},"categoryReviewed":{"type":"boolean","description":"分类是否已由运营确认，未策展时为 false"},"isPlatformProject":{"type":"boolean","description":"是否存在未被隐藏的 project 行（公开页据此判定可见）"},"platformStatus":{"type":"string","enum":["pending","tracked","curated","archived"]},"tags":{"type":"array","items":{"type":"string"},"description":"公开站 /categories 的唯一分类轴"}},"required":["projectTypes","categoryCode","categoryReviewed","isPlatformProject","platformStatus","tags"],"additionalProperties":false},"projectCount":{"type":"number"},"owner":{"type":"string"},"ownerId":{"type":"number"},"name":{"type":"string"},"homepage":{"type":["string","null"]},"contributorCount":{"type":["number","null"]},"commitCount":{"type":["number","null"]},"mentionableUsersCount":{"type":["number","null"]},"pullRequestsCount":{"type":["number","null"]},"releasesCount":{"type":["number","null"]},"latestReleaseName":{"type":["string","null"]},"latestReleaseTagName":{"type":["string","null"]},"latestReleasePublishedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},{"type":"null"}]},"latestReleaseUrl":{"type":["string","null"]},"openGraphImageUrl":{"type":["string","null"]},"iconUrl":{"type":["string","null"]}},"required":["id","fullName","description","repoUrl","topics","languages","licenseSpdxId","stars","forks","subscribersCount","openIssuesCount","defaultBranch","archived","createdAt","pushedAt","lastCommit","classification","projectCount","owner","ownerId","name","homepage","contributorCount","commitCount","mentionableUsersCount","pullRequestsCount","releasesCount","latestReleaseName","latestReleaseTagName","latestReleasePublishedAt","latestReleaseUrl","openGraphImageUrl","iconUrl"],"additionalProperties":false},"latestStats":{"type":"object","properties":{"daily":{"anyOf":[{"type":"object","properties":{"period":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"该日历边界对应的瞬间，按 Asia/Shanghai 解释，不是 UTC 零点"},"date":{"description":"daily 才有：Asia/Shanghai 日历日，如 2026-04-01","type":["string","null"]},"yearWeek":{"description":"weekly 才有：ISO 周，如 2026-W14","type":["string","null"]},"yearMonth":{"description":"monthly 才有：年月，如 2026-03","type":["string","null"]},"totalStars":{"type":["number","null"]},"deltaStars":{"description":"净变化","type":["number","null"]},"deltaNewStars":{"description":"毛新增，与 deltaStars 是两个量，两个都保留","type":["number","null"]},"totalWatchers":{"description":"GitHub watch（通知订阅）人数","type":["number","null"]},"deltaWatchers":{"type":["number","null"]},"totalForks":{"type":["number","null"]},"deltaForks":{"type":["number","null"]},"totalOpenIssues":{"type":["number","null"]},"deltaOpenIssues":{"type":["number","null"]},"totalPullRequests":{"type":["number","null"]},"deltaPullRequests":{"type":["number","null"]},"totalReleases":{"type":["number","null"]},"deltaReleases":{"type":["number","null"]},"totalContributors":{"type":["number","null"]},"deltaContributors":{"type":["number","null"]},"totalCommits":{"type":["number","null"]},"deltaCommits":{"type":["number","null"]},"totalDownloads":{"description":"非 npm 仓库恒为 null","type":["number","null"]},"deltaDownloads":{"type":["number","null"]}},"required":["period","date","yearWeek","yearMonth","totalStars","deltaStars","deltaNewStars","totalWatchers","deltaWatchers","totalForks","deltaForks","totalOpenIssues","deltaOpenIssues","totalPullRequests","deltaPullRequests","totalReleases","deltaReleases","totalContributors","deltaContributors","totalCommits","deltaCommits","totalDownloads","deltaDownloads"],"additionalProperties":false},{"type":"null"}]},"weekly":{"anyOf":[{"type":"object","properties":{"period":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"该日历边界对应的瞬间，按 Asia/Shanghai 解释，不是 UTC 零点"},"date":{"description":"daily 才有：Asia/Shanghai 日历日，如 2026-04-01","type":["string","null"]},"yearWeek":{"description":"weekly 才有：ISO 周，如 2026-W14","type":["string","null"]},"yearMonth":{"description":"monthly 才有：年月，如 2026-03","type":["string","null"]},"totalStars":{"type":["number","null"]},"deltaStars":{"description":"净变化","type":["number","null"]},"deltaNewStars":{"description":"毛新增，与 deltaStars 是两个量，两个都保留","type":["number","null"]},"totalWatchers":{"description":"GitHub watch（通知订阅）人数","type":["number","null"]},"deltaWatchers":{"type":["number","null"]},"totalForks":{"type":["number","null"]},"deltaForks":{"type":["number","null"]},"totalOpenIssues":{"type":["number","null"]},"deltaOpenIssues":{"type":["number","null"]},"totalPullRequests":{"type":["number","null"]},"deltaPullRequests":{"type":["number","null"]},"totalReleases":{"type":["number","null"]},"deltaReleases":{"type":["number","null"]},"totalContributors":{"type":["number","null"]},"deltaContributors":{"type":["number","null"]},"totalCommits":{"type":["number","null"]},"deltaCommits":{"type":["number","null"]},"totalDownloads":{"description":"非 npm 仓库恒为 null","type":["number","null"]},"deltaDownloads":{"type":["number","null"]}},"required":["period","date","yearWeek","yearMonth","totalStars","deltaStars","deltaNewStars","totalWatchers","deltaWatchers","totalForks","deltaForks","totalOpenIssues","deltaOpenIssues","totalPullRequests","deltaPullRequests","totalReleases","deltaReleases","totalContributors","deltaContributors","totalCommits","deltaCommits","totalDownloads","deltaDownloads"],"additionalProperties":false},{"type":"null"}]},"monthly":{"anyOf":[{"type":"object","properties":{"period":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"该日历边界对应的瞬间，按 Asia/Shanghai 解释，不是 UTC 零点"},"date":{"description":"daily 才有：Asia/Shanghai 日历日，如 2026-04-01","type":["string","null"]},"yearWeek":{"description":"weekly 才有：ISO 周，如 2026-W14","type":["string","null"]},"yearMonth":{"description":"monthly 才有：年月，如 2026-03","type":["string","null"]},"totalStars":{"type":["number","null"]},"deltaStars":{"description":"净变化","type":["number","null"]},"deltaNewStars":{"description":"毛新增，与 deltaStars 是两个量，两个都保留","type":["number","null"]},"totalWatchers":{"description":"GitHub watch（通知订阅）人数","type":["number","null"]},"deltaWatchers":{"type":["number","null"]},"totalForks":{"type":["number","null"]},"deltaForks":{"type":["number","null"]},"totalOpenIssues":{"type":["number","null"]},"deltaOpenIssues":{"type":["number","null"]},"totalPullRequests":{"type":["number","null"]},"deltaPullRequests":{"type":["number","null"]},"totalReleases":{"type":["number","null"]},"deltaReleases":{"type":["number","null"]},"totalContributors":{"type":["number","null"]},"deltaContributors":{"type":["number","null"]},"totalCommits":{"type":["number","null"]},"deltaCommits":{"type":["number","null"]},"totalDownloads":{"description":"非 npm 仓库恒为 null","type":["number","null"]},"deltaDownloads":{"type":["number","null"]}},"required":["period","date","yearWeek","yearMonth","totalStars","deltaStars","deltaNewStars","totalWatchers","deltaWatchers","totalForks","deltaForks","totalOpenIssues","deltaOpenIssues","totalPullRequests","deltaPullRequests","totalReleases","deltaReleases","totalContributors","deltaContributors","totalCommits","deltaCommits","totalDownloads","deltaDownloads"],"additionalProperties":false},{"type":"null"}]}},"required":["daily","weekly","monthly"],"additionalProperties":false}},"required":["repo","latestStats"],"additionalProperties":false},"StatsPeriod":{"type":"object","properties":{"period":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"该日历边界对应的瞬间，按 Asia/Shanghai 解释，不是 UTC 零点"},"date":{"description":"daily 才有：Asia/Shanghai 日历日，如 2026-04-01","type":["string","null"]},"yearWeek":{"description":"weekly 才有：ISO 周，如 2026-W14","type":["string","null"]},"yearMonth":{"description":"monthly 才有：年月，如 2026-03","type":["string","null"]},"totalStars":{"type":["number","null"]},"deltaStars":{"description":"净变化","type":["number","null"]},"deltaNewStars":{"description":"毛新增，与 deltaStars 是两个量，两个都保留","type":["number","null"]},"totalWatchers":{"description":"GitHub watch（通知订阅）人数","type":["number","null"]},"deltaWatchers":{"type":["number","null"]},"totalForks":{"type":["number","null"]},"deltaForks":{"type":["number","null"]},"totalOpenIssues":{"type":["number","null"]},"deltaOpenIssues":{"type":["number","null"]},"totalPullRequests":{"type":["number","null"]},"deltaPullRequests":{"type":["number","null"]},"totalReleases":{"type":["number","null"]},"deltaReleases":{"type":["number","null"]},"totalContributors":{"type":["number","null"]},"deltaContributors":{"type":["number","null"]},"totalCommits":{"type":["number","null"]},"deltaCommits":{"type":["number","null"]},"totalDownloads":{"description":"非 npm 仓库恒为 null","type":["number","null"]},"deltaDownloads":{"type":["number","null"]}},"required":["period","date","yearWeek","yearMonth","totalStars","deltaStars","deltaNewStars","totalWatchers","deltaWatchers","totalForks","deltaForks","totalOpenIssues","deltaOpenIssues","totalPullRequests","deltaPullRequests","totalReleases","deltaReleases","totalContributors","deltaContributors","totalCommits","deltaCommits","totalDownloads","deltaDownloads"],"additionalProperties":false},"RepoStatsRange":{"type":"object","properties":{"repoId":{"type":"string"},"fullName":{"type":"string"},"cadence":{"type":"string","enum":["daily","weekly","monthly"]},"timezone":{"type":"string","const":"Asia/Shanghai"},"range":{"type":"object","properties":{"start":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},"end":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"该仓库最新已存周期，不 clamp 到今天"}},"required":["start","end"],"additionalProperties":false},"counts":{"type":"object","properties":{"periods":{"type":"number","description":"窗口内已存的期数"},"returned":{"type":"number"},"hasMore":{"type":"boolean"}},"required":["periods","returned","hasMore"],"additionalProperties":false},"periods":{"type":"array","items":{"type":"object","properties":{"period":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"该日历边界对应的瞬间，按 Asia/Shanghai 解释，不是 UTC 零点"},"date":{"description":"daily 才有：Asia/Shanghai 日历日，如 2026-04-01","type":["string","null"]},"yearWeek":{"description":"weekly 才有：ISO 周，如 2026-W14","type":["string","null"]},"yearMonth":{"description":"monthly 才有：年月，如 2026-03","type":["string","null"]},"totalStars":{"type":["number","null"]},"deltaStars":{"description":"净变化","type":["number","null"]},"deltaNewStars":{"description":"毛新增，与 deltaStars 是两个量，两个都保留","type":["number","null"]},"totalWatchers":{"description":"GitHub watch（通知订阅）人数","type":["number","null"]},"deltaWatchers":{"type":["number","null"]},"totalForks":{"type":["number","null"]},"deltaForks":{"type":["number","null"]},"totalOpenIssues":{"type":["number","null"]},"deltaOpenIssues":{"type":["number","null"]},"totalPullRequests":{"type":["number","null"]},"deltaPullRequests":{"type":["number","null"]},"totalReleases":{"type":["number","null"]},"deltaReleases":{"type":["number","null"]},"totalContributors":{"type":["number","null"]},"deltaContributors":{"type":["number","null"]},"totalCommits":{"type":["number","null"]},"deltaCommits":{"type":["number","null"]},"totalDownloads":{"description":"非 npm 仓库恒为 null","type":["number","null"]},"deltaDownloads":{"type":["number","null"]}},"required":["period","date","yearWeek","yearMonth","totalStars","deltaStars","deltaNewStars","totalWatchers","deltaWatchers","totalForks","deltaForks","totalOpenIssues","deltaOpenIssues","totalPullRequests","deltaPullRequests","totalReleases","deltaReleases","totalContributors","deltaContributors","totalCommits","deltaCommits","totalDownloads","deltaDownloads"],"additionalProperties":false}},"nextCursor":{"type":["string","null"]}},"required":["repoId","fullName","cadence","timezone","range","counts","periods","nextCursor"],"additionalProperties":false},"PeriodCatalog":{"type":"object","properties":{"cadence":{"type":"string","enum":["weekly","monthly"]},"periods":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"year":{"type":"number"},"week":{"type":"number"}},"required":["year","week"],"additionalProperties":false},{"type":"object","properties":{"year":{"type":"number"},"month":{"type":"number"}},"required":["year","month"],"additionalProperties":false}]}}},"required":["cadence","periods"],"additionalProperties":false},"SubscriptionFilters":{"type":"object","properties":{"repoIds":{"description":"显式白名单。给了就完全覆盖其余过滤器，优先级最高也最容易解释","type":"array","items":{"type":"string"}},"projectTypes":{"description":"项目形态。取值 client/server/application/skill/persona","type":"array","items":{"type":"string","enum":["client","server","application","skill","persona"]}},"categoryCodes":{"description":"运营分类 categories.code，与形态是两条正交的轴，不要混用","type":"array","items":{"type":"string"}},"includePlatformProjects":{"description":"是否纳入有未隐藏 project 行的仓库（策展动作因此对外可见）","type":"boolean"},"includeUncurated":{"description":"是否纳入还没有 project 行的候选仓库。它们必然没有分类","type":"boolean"},"includeOwnSubmissions":{"description":"是否纳入该主体自己提交过的仓库","type":"boolean"}}},"SubscriptionRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120,"description":"只给自己看，用来分辨多条订阅"},"callbackUrl":{"type":"string","format":"uri","description":"接收 payload 的地址；投递时按 §3.5 的签名规则"},"cadence":{"default":"daily","type":"string","enum":["daily","weekly","monthly"]},"scopes":{"minItems":1,"type":"array","items":{"type":"string","enum":["repos.stats","repos.rankings","repos.metadata"]}},"filters":{"default":{},"type":"object","properties":{"repoIds":{"description":"显式白名单。给了就完全覆盖其余过滤器，优先级最高也最容易解释","type":"array","items":{"type":"string"}},"projectTypes":{"description":"项目形态。取值 client/server/application/skill/persona","type":"array","items":{"type":"string","enum":["client","server","application","skill","persona"]}},"categoryCodes":{"description":"运营分类 categories.code，与形态是两条正交的轴，不要混用","type":"array","items":{"type":"string"}},"includePlatformProjects":{"description":"是否纳入有未隐藏 project 行的仓库（策展动作因此对外可见）","type":"boolean"},"includeUncurated":{"description":"是否纳入还没有 project 行的候选仓库。它们必然没有分类","type":"boolean"},"includeOwnSubmissions":{"description":"是否纳入该主体自己提交过的仓库","type":"boolean"}}},"mode":{"default":"batch","description":"batch 按水位线增量推；snapshot 每次推范围内全部最新一期","type":"string","enum":["batch","snapshot"]},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"}},"required":["name","callbackUrl","scopes"]},"Subscription":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"callbackUrl":{"type":"string"},"signingKeyPrefix":{"type":"string","description":"签名 key 的前缀，仅供人工比对，不是密钥"},"cadence":{"type":"string","enum":["daily","weekly","monthly"]},"mode":{"type":"string","enum":["batch","snapshot"]},"scopes":{"type":"array","items":{"type":"string","enum":["repos.stats","repos.rankings","repos.metadata"]}},"filters":{"type":"object","properties":{"repoIds":{"description":"显式白名单。给了就完全覆盖其余过滤器，优先级最高也最容易解释","type":"array","items":{"type":"string"}},"projectTypes":{"description":"项目形态。取值 client/server/application/skill/persona","type":"array","items":{"type":"string","enum":["client","server","application","skill","persona"]}},"categoryCodes":{"description":"运营分类 categories.code，与形态是两条正交的轴，不要混用","type":"array","items":{"type":"string"}},"includePlatformProjects":{"description":"是否纳入有未隐藏 project 行的仓库（策展动作因此对外可见）","type":"boolean"},"includeUncurated":{"description":"是否纳入还没有 project 行的候选仓库。它们必然没有分类","type":"boolean"},"includeOwnSubmissions":{"description":"是否纳入该主体自己提交过的仓库","type":"boolean"}},"additionalProperties":false},"filtersVersion":{"type":"number","description":"过滤器每次变更 +1；消费方据此区分「新数据」与「改过滤器后的补发」"},"enabled":{"type":"boolean"},"disabledReason":{"anyOf":[{"type":"string","enum":["too_many_failures","admin"]},{"type":"null"}],"description":"连续失败到熔断是 too_many_failures；管理员停用是 admin"},"watermark":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},{"type":"null"}],"description":"batch 模式读到哪一期了。投递成功才推进，失败不动"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},"expiresAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},{"type":"null"}]}},"required":["id","name","callbackUrl","signingKeyPrefix","cadence","mode","scopes","filters","filtersVersion","enabled","disabledReason","watermark","createdAt","expiresAt"],"additionalProperties":false},"SubscriptionCreated":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"callbackUrl":{"type":"string"},"signingKeyPrefix":{"type":"string","description":"签名 key 的前缀，仅供人工比对，不是密钥"},"cadence":{"type":"string","enum":["daily","weekly","monthly"]},"mode":{"type":"string","enum":["batch","snapshot"]},"scopes":{"type":"array","items":{"type":"string","enum":["repos.stats","repos.rankings","repos.metadata"]}},"filters":{"type":"object","properties":{"repoIds":{"description":"显式白名单。给了就完全覆盖其余过滤器，优先级最高也最容易解释","type":"array","items":{"type":"string"}},"projectTypes":{"description":"项目形态。取值 client/server/application/skill/persona","type":"array","items":{"type":"string","enum":["client","server","application","skill","persona"]}},"categoryCodes":{"description":"运营分类 categories.code，与形态是两条正交的轴，不要混用","type":"array","items":{"type":"string"}},"includePlatformProjects":{"description":"是否纳入有未隐藏 project 行的仓库（策展动作因此对外可见）","type":"boolean"},"includeUncurated":{"description":"是否纳入还没有 project 行的候选仓库。它们必然没有分类","type":"boolean"},"includeOwnSubmissions":{"description":"是否纳入该主体自己提交过的仓库","type":"boolean"}},"additionalProperties":false},"filtersVersion":{"type":"number","description":"过滤器每次变更 +1；消费方据此区分「新数据」与「改过滤器后的补发」"},"enabled":{"type":"boolean"},"disabledReason":{"anyOf":[{"type":"string","enum":["too_many_failures","admin"]},{"type":"null"}],"description":"连续失败到熔断是 too_many_failures；管理员停用是 admin"},"watermark":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},{"type":"null"}],"description":"batch 模式读到哪一期了。投递成功才推进，失败不动"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},"expiresAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},{"type":"null"}]},"signingKey":{"type":"string","description":"验签密钥。同一把签名 key 名下的所有订阅共用；由 key 派生，可随时重取"}},"required":["id","name","callbackUrl","signingKeyPrefix","cadence","mode","scopes","filters","filtersVersion","enabled","disabledReason","watermark","createdAt","expiresAt","signingKey"],"additionalProperties":false},"SubscriptionList":{"type":"object","properties":{"subscriptions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"callbackUrl":{"type":"string"},"signingKeyPrefix":{"type":"string","description":"签名 key 的前缀，仅供人工比对，不是密钥"},"cadence":{"type":"string","enum":["daily","weekly","monthly"]},"mode":{"type":"string","enum":["batch","snapshot"]},"scopes":{"type":"array","items":{"type":"string","enum":["repos.stats","repos.rankings","repos.metadata"]}},"filters":{"type":"object","properties":{"repoIds":{"description":"显式白名单。给了就完全覆盖其余过滤器，优先级最高也最容易解释","type":"array","items":{"type":"string"}},"projectTypes":{"description":"项目形态。取值 client/server/application/skill/persona","type":"array","items":{"type":"string","enum":["client","server","application","skill","persona"]}},"categoryCodes":{"description":"运营分类 categories.code，与形态是两条正交的轴，不要混用","type":"array","items":{"type":"string"}},"includePlatformProjects":{"description":"是否纳入有未隐藏 project 行的仓库（策展动作因此对外可见）","type":"boolean"},"includeUncurated":{"description":"是否纳入还没有 project 行的候选仓库。它们必然没有分类","type":"boolean"},"includeOwnSubmissions":{"description":"是否纳入该主体自己提交过的仓库","type":"boolean"}},"additionalProperties":false},"filtersVersion":{"type":"number","description":"过滤器每次变更 +1；消费方据此区分「新数据」与「改过滤器后的补发」"},"enabled":{"type":"boolean"},"disabledReason":{"anyOf":[{"type":"string","enum":["too_many_failures","admin"]},{"type":"null"}],"description":"连续失败到熔断是 too_many_failures；管理员停用是 admin"},"watermark":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},{"type":"null"}],"description":"batch 模式读到哪一期了。投递成功才推进，失败不动"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},"expiresAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},{"type":"null"}]}},"required":["id","name","callbackUrl","signingKeyPrefix","cadence","mode","scopes","filters","filtersVersion","enabled","disabledReason","watermark","createdAt","expiresAt"],"additionalProperties":false}},"count":{"type":"number"}},"required":["subscriptions","count"],"additionalProperties":false},"DeliveryRecord":{"type":"object","properties":{"eventId":{"type":"string","description":"幂等键。重试不变，接收方按它去重"},"status":{"type":"string","enum":["pending","delivered","failed"]},"attempt":{"type":"number"},"httpStatus":{"type":["number","null"]},"error":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"}},"required":["eventId","status","attempt","httpStatus","error","createdAt"],"additionalProperties":false},"SubscriptionDetail":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"callbackUrl":{"type":"string"},"signingKeyPrefix":{"type":"string","description":"签名 key 的前缀，仅供人工比对，不是密钥"},"cadence":{"type":"string","enum":["daily","weekly","monthly"]},"mode":{"type":"string","enum":["batch","snapshot"]},"scopes":{"type":"array","items":{"type":"string","enum":["repos.stats","repos.rankings","repos.metadata"]}},"filters":{"type":"object","properties":{"repoIds":{"description":"显式白名单。给了就完全覆盖其余过滤器，优先级最高也最容易解释","type":"array","items":{"type":"string"}},"projectTypes":{"description":"项目形态。取值 client/server/application/skill/persona","type":"array","items":{"type":"string","enum":["client","server","application","skill","persona"]}},"categoryCodes":{"description":"运营分类 categories.code，与形态是两条正交的轴，不要混用","type":"array","items":{"type":"string"}},"includePlatformProjects":{"description":"是否纳入有未隐藏 project 行的仓库（策展动作因此对外可见）","type":"boolean"},"includeUncurated":{"description":"是否纳入还没有 project 行的候选仓库。它们必然没有分类","type":"boolean"},"includeOwnSubmissions":{"description":"是否纳入该主体自己提交过的仓库","type":"boolean"}},"additionalProperties":false},"filtersVersion":{"type":"number","description":"过滤器每次变更 +1；消费方据此区分「新数据」与「改过滤器后的补发」"},"enabled":{"type":"boolean"},"disabledReason":{"anyOf":[{"type":"string","enum":["too_many_failures","admin"]},{"type":"null"}],"description":"连续失败到熔断是 too_many_failures；管理员停用是 admin"},"watermark":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},{"type":"null"}],"description":"batch 模式读到哪一期了。投递成功才推进，失败不动"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},"expiresAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},{"type":"null"}]},"signingKey":{"type":"string","description":"验签密钥。与创建响应里的是同一个值，丢了从这里重取即可"},"matchedRepos":{"type":"number","description":"当前过滤器命中的仓库数。为 0 时水位线既不推进也不回退（§6.4）"},"lastDeliveredAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},{"type":"null"}]},"lastError":{"type":["string","null"]},"consecutiveFailures":{"type":"number"},"deliveries":{"type":"array","items":{"type":"object","properties":{"eventId":{"type":"string","description":"幂等键。重试不变，接收方按它去重"},"status":{"type":"string","enum":["pending","delivered","failed"]},"attempt":{"type":"number"},"httpStatus":{"type":["number","null"]},"error":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"}},"required":["eventId","status","attempt","httpStatus","error","createdAt"],"additionalProperties":false},"description":"最近 20 条，按时间倒序"}},"required":["id","name","callbackUrl","signingKeyPrefix","cadence","mode","scopes","filters","filtersVersion","enabled","disabledReason","watermark","createdAt","expiresAt","signingKey","matchedRepos","lastDeliveredAt","lastError","consecutiveFailures","deliveries"],"additionalProperties":false},"SubscriptionUpdate":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"callbackUrl":{"type":"string","format":"uri"},"filters":{"type":"object","properties":{"repoIds":{"description":"显式白名单。给了就完全覆盖其余过滤器，优先级最高也最容易解释","type":"array","items":{"type":"string"}},"projectTypes":{"description":"项目形态。取值 client/server/application/skill/persona","type":"array","items":{"type":"string","enum":["client","server","application","skill","persona"]}},"categoryCodes":{"description":"运营分类 categories.code，与形态是两条正交的轴，不要混用","type":"array","items":{"type":"string"}},"includePlatformProjects":{"description":"是否纳入有未隐藏 project 行的仓库（策展动作因此对外可见）","type":"boolean"},"includeUncurated":{"description":"是否纳入还没有 project 行的候选仓库。它们必然没有分类","type":"boolean"},"includeOwnSubmissions":{"description":"是否纳入该主体自己提交过的仓库","type":"boolean"}}},"scopes":{"minItems":1,"type":"array","items":{"type":"string","enum":["repos.stats","repos.rankings","repos.metadata"]}},"enabled":{"description":"false = 暂停（队列保留），true = 恢复","type":"boolean"},"expiresAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},{"type":"null"}]}}},"SubscriptionTest":{"type":"object","properties":{"id":{"type":"string"},"eventId":{"type":"string"},"delivered":{"type":"boolean"},"httpStatus":{"type":["number","null"]},"error":{"type":["string","null"]},"deliveredAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"}},"required":["id","eventId","delivered","httpStatus","error","deliveredAt"],"additionalProperties":false},"SkillScanRequest":{"type":"object","properties":{"repoFullName":{"type":"string","pattern":"^[^/\\s]+\\/[^/\\s]+$","description":"GitHub 仓库全名，例如 anthropics/skills"},"ref":{"description":"分支、tag 或 commit sha。缺省取默认分支","type":"string","minLength":1,"maxLength":200},"skillDir":{"description":"仓库内的相对目录，例如 `skills/pdf`。缺省扫描整个仓库","type":"string","minLength":1,"maxLength":400},"includeLlm":{"description":"缺省 true","type":"boolean"}},"required":["repoFullName"],"additionalProperties":false},"SkillScanResponse":{"type":"object","properties":{"repoFullName":{"type":"string"},"skillDir":{"type":"string"},"ref":{"type":"string"},"source":{"type":"string","enum":["local-clone","vercel-sandbox","vercel-sandbox-serverless"]},"context":{"type":"object","properties":{"owner":{"type":["string","null"]},"homepage":{"type":["string","null"]},"stars":{"type":["number","null"]},"license":{"type":["string","null"]}},"additionalProperties":false,"description":"来源：@workspace/security-scan/src/types.ts 的 ScanContext"},"grade":{"type":"string","enum":["safe","caution","unsafe","reject","unknown"]},"flags":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"severity":{"type":"string","enum":["critical","high","medium","low"]},"description":{"type":"string"},"file":{"type":"string"},"line":{"type":"number"},"snippet":{"type":"string"},"inCodeBlock":{"type":"boolean"},"citedOrNegated":{"type":"boolean"}},"required":["name","severity","description"],"additionalProperties":false,"description":"来源：@workspace/security-scan/src/types.ts 的 SecurityFlagHit"}},"trustTier":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2},{"type":"number","const":3},{"type":"number","const":4},{"type":"number","const":5}]},"llmGrade":{"description":"阶段 2 的评级；跳过阶段 2 时缺省","type":"string","enum":["safe","caution","unsafe","reject","unknown"]},"llmAnalysis":{"description":"阶段 2 的完整分析。来源：@workspace/security-scan 的 LlmAnalysis"},"scannedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"ISO 8601 时间戳"},"rulesVersion":{"type":"string","description":"本次执行所用的规则版本，例如 v1.0.0"},"fileCount":{"type":"number"},"truncated":{"type":"boolean","description":"是否在达到文件/体积上限后提前停止"},"truncatedReason":{"description":"`max_files` / `max_total_bytes` / `file_too_large`","type":"string"},"files":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"size":{"type":"number"}},"required":["path","size"],"additionalProperties":false}}},"required":["repoFullName","source","context","grade","flags","trustTier","scannedAt","rulesVersion","fileCount","truncated","files"],"additionalProperties":false}}}}