限速规则

为了保护 API 服务的稳定性和公平性,我们对公开 API 实施了基于 IP 的限速机制。


默认限额

每个 IP 地址默认享有以下限额:

  • Name
    每日请求次数
    Description

    150 次

  • Name
    重置时间
    Description

    每天 UTC 0:00(北京时间早上 8:00)

  • Name
    计费单位
    Description

    按 IP 地址计算

限额计算规则

  • 每次 API 调用消耗 1 次请求配额
  • 无论请求成功或失败(除网络错误外),都会计入配额
  • 404(未找到)、400(参数错误)等响应也会消耗配额
  • 只有 429(超限)响应不消耗配额

Rate Limit 信息

{
  "rateLimit": {
    "remaining": 148,
    "limit": 150,
    "reset": "2025-10-24T00:00:00.000Z"
  }
}

响应头

每个 API 响应都包含以下响应头,方便您监控配额使用:

  • Name
    X-RateLimit-Limit
    Description

    每日总限额(通常为 150)

  • Name
    X-RateLimit-Remaining
    Description

    今日剩余请求次数

  • Name
    X-RateLimit-Reset
    Description

    配额重置时间(ISO 8601 格式)

查看响应头

curl -I "https://api.keykey.cc/api/public/memory-card?word=hello"

# 响应头示例
# X-RateLimit-Limit: 150
# X-RateLimit-Remaining: 148
# X-RateLimit-Reset: 2025-10-24T00:00:00.000Z

超限处理

当您的请求次数超过每日限额时,API 会返回 429 Too Many Requests 状态码。

超限响应

  • 状态码: 429
  • 错误码: RATE_LIMIT_EXCEEDED
  • 建议: 等待配额重置或联系管理员申请白名单

最佳实践

  1. 在客户端实现缓存机制
  2. 监控剩余请求次数,接近限额时提醒用户
  3. 批量查询时添加延迟
  4. 合理规划请求频率

429 响应示例

{
  "success": false,
  "error": "请求次数已达今日上限",
  "code": "RATE_LIMIT_EXCEEDED",
  "rateLimit": {
    "remaining": 0,
    "limit": 150,
    "reset": "2025-10-24T00:00:00.000Z"
  }
}

IP 白名单

如果您需要更高的请求限额,可以申请加入 IP 白名单。

白名单特权

  • 不受限制: 白名单 IP 不受每日 150 次限制
  • 响应优先: 享有更高的服务优先级
  • 适用场景: 高频查询、数据分析、批量处理等

申请条件

满足以下任一条件即可申请:

  1. 开源项目: 您的项目是开源的,使用本 API 提供公益服务
  2. 教育用途: 用于教学、学习或研究目的
  3. 商业合作: 需要大量调用 API 的商业项目

申请方式

请通过以下方式联系管理员:

  • GitHub: 在项目仓库提交 Issue
  • 邮箱: 发送申请邮件(包含项目介绍和使用场景)

申请时请提供:

  • 您的固定 IP 地址
  • 项目简介和用途说明
  • 预估日请求量
  • 项目网址(如有)

白名单 IP 响应

{
  "success": true,
  "data": { ... },
  "rateLimit": {
    "remaining": null,
    "limit": null,
    "reset": null
  }
}

监控配额使用

async function checkRateLimit() {
  const response = await fetch(
    'https://api.keykey.cc/api/public/memory-card?word=test'
  )
  
  const remaining = parseInt(response.headers.get('X-RateLimit-Remaining'))
  const limit = parseInt(response.headers.get('X-RateLimit-Limit'))
  const reset = response.headers.get('X-RateLimit-Reset')
  
  const percentage = (remaining / limit) * 100
  
  console.log(`剩余请求: ${remaining}/${limit} (${percentage.toFixed(1)}%)`)
  console.log(`重置时间: ${new Date(reset).toLocaleString()}`)
  
  // 警告阈值
  if (percentage < 10) {
    console.warn('⚠️ 请求配额不足 10%!')
  } else if (percentage < 20) {
    console.warn('⚠️ 请求配额不足 20%')
  }
  
  return { remaining, limit, reset, percentage }
}

// 使用示例
const rateLimitStatus = await checkRateLimit()

常见问题

为什么我的配额消耗得特别快?

可能的原因:

  • 您与其他用户共享同一个公网 IP(如公司网络、校园网)
  • 没有实现客户端缓存,重复查询相同单词
  • 批量查询时没有控制请求频率

建议实现本地缓存机制,避免重复请求。

配额什么时候重置?

配额在每天 UTC 0:00(北京时间早上 8:00)自动重置为 150 次。

您可以通过响应头 X-RateLimit-Reset 查看精确的重置时间。

150 次请求够用吗?

对于大多数使用场景,150 次/天是足够的:

  • 个人学习使用:查询 50-100 个单词,配合缓存可用多天
  • 小型应用:100-200 个活跃用户
  • 开发测试:完全够用

如需更高配额,请申请白名单。

如何避免超限?

推荐的最佳实践:

  1. 实现客户端缓存(24小时)
  2. 监控 rateLimit.remaining 字段
  3. 剩余次数 < 50 时提醒用户
  4. 批量查询时添加延迟(100-200ms)
  5. 在用户输入时使用防抖(debounce)

下一步

Was this page helpful?