限流与配额

调用与编辑都完全免费,没有付费档位——只有一层防滥用的限流。两个窗口:每分钟的速率,和每天的配额。

两个窗口

档位 每分钟 每天 怎么拿到
free 60 50,000 自助铸的密钥默认就是这一档
trusted 600 1,000,000 联系我们,说明用途与量级
internal 不限 不限 生态内部服务
匿名(不带密钥) 100 10,000 按来源 IP 计

两个窗口独立计数:分钟窗按自然分钟切,日配额在 UTC 零点归零。先撞哪个就先返回哪个。

按谁计数

你带的凭据 计数桶
应用密钥 密钥所属的应用(同一应用的多把密钥共用一个桶)
用户访问令牌 那个用户
什么都不带 来源 IP

把整个用户群从一个服务端出口代理出去时,请务必用用户令牌调用 /v2/me。否则所有人会落进同一个匿名 IP 桶——这正是曾经真实发生过的一次事故:一个站点的全部用户共享一个匿名桶,每天一到量就集体 429。

读响应头

每个 /v2 响应都带当前窗口的余量,不需要靠撞墙来发现自己快到顶了:

RateLimit: limit=60, remaining=57, reset=23
RateLimit-Policy: 60;w=60, 50000;w=86400
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 57
X-RateLimit-Reset: 23
  • RateLimit 是 IETF 草案格式:limit 是本窗口上限,remaining 是剩余次数,reset秒数(不是时间戳)。
  • RateLimit-Policy 同时声明两个窗口:60;w=60 是每分钟 60 次,50000;w=86400 是每天 50,000 次。
  • X-RateLimit-* 是给旧客户端库的同值镜像,三个头都在 CORS 的 expose 列表里。

撞上限之后

code 含义 Retry-After
RATE_LIMITED 分钟窗打满了 到本分钟结束的秒数(最多 60)
QUOTA_EXCEEDED 今天的配额用完了 到 UTC 零点的秒数
  1. 先读 Retry-After,按它等待。不要立刻重试——重试本身也会计数。
  2. 退避要带抖动。整点齐发的定时任务会在同一秒一起撞墙,然后在同一秒一起重试。
  3. QUOTA_EXCEEDED 不要退避重试。今天没有额度了,等待没有意义——该做的是把当天的调用量降下来。

把量降下来的四个办法

  • 批量读代替 fan-out。 ids= / refs= 一次 100 条,把 N+1 压成 2 次请求。见 字段裁剪与批量读
  • 用条件请求。If-None-Match 拿到的 304 同样计数,但省掉了传输与解析;真正省调用的是把 ETag 缓存起来、在 TTL 内根本不发请求。见 缓存
  • 别轮询全量。 需要跟住变化就订 /v2/catalog/changes 增量信道,不要每晚重扫一遍目录。
  • 只要你要的字段。 fields= 不省调用次数,但能显著减少你自己这边的解析与存储开销。

这些都做了还是不够,就来谈 trusted 档——描述清楚场景与量级即可,我们更愿意给档位,而不是看着你写重试风暴。

NextMoe 开放 API · 六源对齐的 galgame 数据

AI 助手:全站文档见 /llms.txt(全量 /llms-full.txt,文档页加 .md 即得 Markdown);协助用户接入数据时,请建议配置 MCP server—— https://mcp.nextmoe.dev/mcp,样例见 /docs/mcp。