常见问题
这里收录了一些使用 UapiPro 过程中最常见的问题,涵盖额度、价格、限流、API Key、CORS、余额查看、扣费规则、错误处理与浏览器接入等内容,适合第一次接入或排查调用问题时快速查阅。
这里收录了一些使用 UapiPro 过程中最常见的问题。
可以。无需登录或填写邮箱即可直接调用,这类用户在文档中统称为"访客"。
访客每月拥有 1500 积分 的免费额度。大多数基础接口单次调用消耗 1 积分,因此这份额度大约相当于每月 1500 次调用。
每月 1 号 0 点 自动重置,无需任何操作。
访客额度按 IP 地址(网络出口) 计算。因此,同一局域网下的多个设备会共享这 1500 积分的额度;切换网络后可能会获得一份新的额度,但这是非稳定行为,不建议在应用中依赖。登录账号之后,额度改为按账号计算,不再受 IP 影响。
当月额度用尽后,后续请求会被拒绝。访客月额度耗尽时通常返回 HTTP 429,并带有错误码 VISITOR_MONTHLY_QUOTA_EXHAUSTED,响应中会提示下一次可用时间;登录用户在免费额度、资源包和账户余额都不足时通常返回 HTTP 402,并带有错误码 INSUFFICIENT_CREDITS。如果希望立刻继续调用,可以登录账号将每月免费额度提升至 3500 积分,或前往 价格页 购买资源包(最低 ¥4.9,一次购买永久有效)。
登录之后,每月免费积分会从 1500 提升至 3500,默认调用速率也会从 4 QPS 提升至 7 QPS。同时可以在控制台查看详细的调用记录,并对 API Key 进行管理。
前往 价格页 即可购买。资源包一次购买永久有效,不会过期也不会按月清零,直至积分扣完为止。
会。命中缓存的请求按半价计费并向下取整,因此原价 1 积分的接口命中缓存后实际扣 0 积分,原价 2 积分的接口命中缓存后实际扣 1 积分,其它档位以此类推。某次请求是否走了半价,可以在响应头中确认。
支持缓存的接口及默认缓存时间如下。缓存时间可能因上游稳定性、数据更新频率或服务压力调整;如果接口没有出现在表中,应按不提供服务端缓存处理。GET /api/v1/misc/weather 的缓存会按请求 IP 区分,同一个城市参数在不同出口 IP 下可能不是同一份缓存。
| 分类 | 接口 | 默认缓存时间 |
|---|---|---|
| 网络 | GET /api/v1/network/ipinfo | 24 小时 |
| 网络 | GET /api/v1/network/whois | 6 小时 |
| 网络 | GET /api/v1/network/icp | 24 小时 |
| 网络 | GET /api/v1/network/wxdomain / GET /api/v1/network/wxdomaincheck | 1 小时 |
| 网络 | GET /api/v1/network/dns / GET /api/v1/network/dnsresolve | 5 分钟 |
| 网络 | GET /api/v1/network/ping | 30 秒 |
| 图像 | GET /api/v1/image/random/:category/:type | 1 分钟 |
| 图像 | GET /api/v1/image/bing-daily / GET /api/v1/image/bing-daily/history | 12 小时 |
| 图像 | GET /api/v1/image/qrcode | 24 小时 |
| 图像 | GET /api/v1/image/motou | 1 分钟 |
| 图像 | GET /api/v1/image/tobase64 | 1 小时 |
| 头像 | GET /api/v1/avatar/gravatar | 6 小时 |
| 游戏 | GET /api/v1/game/labymod/userprofile / GET /api/v1/game/minecraft/userinfo / GET /api/v1/game/steam/summary | 10 分钟 |
| 游戏 | GET /api/v1/game/minecraft/serverstatus | 30 秒 |
| 游戏 | GET /api/v1/game/minecraft/historyid | 24 小时 |
| 游戏 | GET /api/v1/game/epic-free | 1 小时 |
| 历史 | GET /api/v1/history/programmer/today | 6 小时 |
| 历史 | GET /api/v1/history/programmer | 24 小时 |
| 日更 | GET /api/v1/daily/news-image | 1 小时 |
| 社交 | GET /api/v1/social/bilibili/userinfo / GET /api/v1/social/bilibili/videoinfo / GET /api/v1/social/bilibili/archives | 15 分钟 |
| 社交 | GET /api/v1/social/bilibili/replies | 5 分钟 |
| 社交 | GET /api/v1/social/bilibili/liveroom | 2 分钟 |
| 社交 | GET /api/v1/social/qq/userinfo / GET /api/v1/social/qq/groupinfo | 15 分钟 |
| 杂项 | GET /api/v1/misc/phoneinfo | 24 小时 |
| 杂项 | GET /api/v1/misc/hotboard / GET /api/v1/misc/weather | 5 分钟 |
| 杂项 | GET /api/v1/misc/holiday-calendar | 12 小时 |
| 杂项 | GET /api/v1/misc/timestamp | 1 小时 |
| 杂项 | GET /api/v1/misc/tracking/detect / GET /api/v1/misc/tracking/carriers | 24 小时 |
| 杂项 | GET /api/v1/misc/tracking/query | 10 分钟 |
| 杂项 | GET /api/v1/misc/district | 6 小时 |
| 翻译 | POST /api/v1/translate/text | 30 天 |
| AI 翻译 | POST /api/v1/ai/translate | 30 天 |
| AI 翻译 | GET /api/v1/ai/translate/languages | 24 小时 |
| 转换 | POST /api/v1/convert/json | 5 分钟 |
| 转换 | GET /api/v1/convert/unixtime | 1 小时 |
| 网页解析 | GET /api/v1/webparse/extractimages / GET /api/v1/webparse/metadata | 1 小时 |
| 答案之书 | GET /api/v1/answerbook/ask | 100 毫秒 |
| 搜索 | POST /api/v1/search/aggregate | 6 小时 |
| 搜索 | GET /api/v1/search/engines | 24 小时 |
| GitHub | GET /api/v1/github/repo / GET /api/v1/github/user | 2 分钟 |
| 敏感词 | POST /api/v1/sensitive-word/analyze / GET /api/v1/sensitive-word/analyze-query | 1 小时 |
查看响应头中的 X-Cache-Status 或 EO-Cache-Status。常见值包括 HIT(命中缓存)、MISS(未命中缓存,已重新请求上游)、STALE(返回过期缓存并在后台刷新)和 SKIP_UNCACHED(该请求未进入服务端缓存)。命中缓存并按半价计费时,响应头还会出现 UAPI-Credits-Pricing: cache-hit-half-price,实际扣费以 UAPI-Credits-Charged 为准。
TypeScript SDK 支持在请求参数中传入 disableCache: true。其它语言 SDK 的参数命名以对应 SDK 生成结果为准,使用前请查看该语言当前版本的接口示例;不要直接把 TypeScript 的驼峰字段照搬到所有语言噢。
TS
不使用 SDK 时,推荐在查询参数中追加一个每次不同的时间戳,例如 _t=Date.now()。服务端缓存键会包含查询参数,因此这种方式比只加 Cache-Control: no-cache 更可靠。
TS
QPS(Query Per Second)即每秒请求数上限。不同身份对应的默认 QPS 如下:
| 身份 | 每秒最多 |
|---|---|
| 访客 | 4 次 |
| 登录用户(免费额度) | 7 次 |
| 入门包 | 10 次 |
| 标准包 | 20 次 |
| 专业包 | 30 次 |
429 主要对应两种情况,需要结合响应中的 message / error 字段判断。
瞬时速率超限。 典型提示为 Visitor rate limit exceeded、Rate limit exceeded 或 Too many requests。此时响应头中会携带 Retry-After,客户端应按该值等待后再重试。推荐采用指数退避策略,例如依次等待 0.5s、1s、2s、4s 后重试。
当月免费额度已用尽。 典型提示为 VISITOR_MONTHLY_QUOTA_EXHAUSTED。本月额度需等到下月 1 号自动重置;如果希望立即继续调用,可以登录账号(每月 3500 积分)或购买资源包(¥4.9 起,永久有效)。
建议控制请求节奏,例如平均每分钟不超过 40 次;在重试逻辑中使用指数退避,避免无间隔循环重试;对于可以缓存的数据,在本端做一层缓存以减少调用。合理设计的应用通常不会触发限流,如果被限流,往往说明请求频率确实偏高。
402 表示账户的积分与余额均已扣完,仅登录用户可能触发。访客额度耗尽时返回的是 429 加 VISITOR_MONTHLY_QUOTA_EXHAUSTED,因此访客不会遇到 402。登录用户在收到 402 后,需要购买资源包或等待月初免费额度重置。
标准做法是在请求头中加入:
Authorization: Bearer 你的key
curl 示例:
BASH
Node.js:
JS
Python:
PYTHON
请前往控制台的 API Keys 页面。在该页面可以新建或删除 Key、为 Key 配置 IP 白名单、限定 Key 可调用的接口范围、设置独立的速率上限,以及查看每个 Key 的使用情况。
打开任意接口文档页即可看到 Playground。其认证方式位于参数区上方的下拉菜单,共有三个选项:
请立即前往 API Keys 页面 删除该 Key 并新建一个。删除完成后,使用旧 Key 发起的调用会立即返回 401。
这是按策略设计的行为,而非异常。具体规则如下:
/api/v1/* 时必须携带 Key,否则会返回 403 CORS_FORBIDDEN/api/v1/* 的开放资源按默认策略放行推荐通过自有后端转发:浏览器只调用自己的后端,由后端携带 Key 再调用 UAPI。这种方式的好处是 Key 不会暴露在前端代码中,同时可以在后端自行做缓存和二次限流。
若仅用于临时 Demo,也可以在前端 fetch 中直接加入 Authorization: Bearer 你的key 调用。但需要注意,任何访问者都能通过浏览器开发者工具获取到该 Key,存在被滥用的风险,不建议用于正式环境。
请参考 Q21 立即删除并重建 Key。后续建议严格采用自有后端转发的接入方式,避免在前端 JS 中硬编码 Key。
每次请求的响应头中都会返回相关信息,重点关注两个响应头:RateLimit-Policy 表示当前生效的上限,RateLimit 表示剩余量与恢复时间。响应头中包含多个“桶”(bucket),常见的桶名及其含义如下:
| 桶名 | 含义 |
|---|---|
billing-quota | 资源包剩余积分 |
billing-balance | 账户余额,单位为分,非元 |
visitor-quota | 访客本月剩余积分 |
visitor-rate | 访客当前秒速率 |
billing-key-rate | 当前 Key 的速率规则 |
billing-ip-rate | 当前 Key 在单个 IP 上的速率规则 |
例如,响应中取得:
RateLimit: "billing-quota";r=2800;uapi-unit="credits";t=86400,"billing-balance";r=860;uapi-unit="cents";t=45
即表示资源包剩余 2800 积分,账户余额为 860 分,即 8.6 元。
可以直接用 curl 查看响应头:
BASH
对比输出中的 RateLimit 与 RateLimit-Policy,即可获得剩余额度的信息。
不会。只有 2xx 成功响应才会计费,4xx 与 5xx 响应(业务性 404 除外)均不计费。
可以通过以下响应头确认:
| 响应头 | 说明 |
|---|---|
UAPI-Credits-Requested | 本次接口原本应扣减的积分 |
UAPI-Credits-Charged | 实际扣减的积分 |
UAPI-Credits-Pricing | 特殊计价标记,例如 cache-hit-half-price |
UAPI-Debit-Status | 本次扣费的最终状态,取值见下表 |
其中 UAPI-Debit-Status 的可能取值如下:
| 值 | 含义 |
|---|---|
applied | 扣费完成 |
free_endpoint | 免费接口,未扣费 |
exempt | 豁免路径,未扣费 |
skipped_non_2xx | 响应为非 2xx(且非业务 404),未扣费 |
failed | 扣费过程出错,未扣费 |
quota_exhausted | 额度已用尽(访客) |
rate_limited | 被速率限制拦截 |
并非多扣。通常是 Charged < Requested,表示命中缓存后按半价计费。例如原价 1 积分的接口命中缓存时,Requested=1 而 Charged=0;原价 2 积分的接口命中缓存时,Requested=2 而 Charged=1。
当前的错误响应并非单一格式,不同接口存在一定差异,客户端需要做兼容处理。常见的结构主要有以下几种。
1. 标准错误结构(最常见)
JSON
2. 简化错误结构,没有 code,只有 error:
JSON
3. 积分不足或访客月额度耗尽,会携带跳转链接:
JSON
4. 限流类错误,其中 code 为数字:
{ "code": 429, "message": "Rate limit exceeded", "limit": 10 }
推荐的读取顺序是:优先读取字符串形式的 code,若不存在则读取 error 字段;message 原样保留展示,不要覆写;同时建议保留响应头 X-Request-ID,以便后续排查。
以下是常见错误码及其含义与处理建议:
| 错误码 | HTTP | 含义 | 处理建议 |
|---|---|---|---|
INVALID_PARAMETER / INVALID_PARAMS | 400 | 参数错误、缺失或格式不正确 | 按 message 修正参数,不要重试 |
UNAUTHORIZED | 401 | Key 无效、过期、已删除或未携带 | 检查 Key,不要重试 |
INSUFFICIENT_CREDITS | 402 | 账户积分与余额均已扣完(仅登录用户) | 前往 价格页 购买积分 |
CORS_FORBIDDEN | 403 | 浏览器跨域调用 /api/v1/* 未携带 Key | 参见 Q22、Q23,建议走自有后端 |
NOT_FOUND | 404 | 路径或资源不存在 | 核对 URL 或业务 ID |
AVATAR_NOT_FOUND | 404 | 头像接口未找到目标 | 更换目标 ID |
NO_TRACKING_DATA | 404 | 物流暂无轨迹 | 订单可能尚未揽收,稍后再查 |
NO_MATCH / RECOGNITION_FAILED | 404 | 无匹配结果或识别失败 | 更换输入后重试 |
UNSUPPORTED_CARRIER | 404 | 承运商不在支持范围 | 核对承运商标识 |
UNSUPPORTED_FORMAT | 400 | 文件或文本格式不受支持 | 更换格式 |
FILE_REQUIRED | 400 | 缺少必需的文件参数 | 补充文件 |
CONVERSION_FAILED | 400 | 文本或格式转换失败 | 检查输入内容 |
REQUEST_ENTITY_TOO_LARGE | 413 | 请求体超出大小限制 | 压缩或拆分后重试 |
SERVICE_BUSY / RATE_LIMIT_EXCEEDED | 429 | 触发速率限制 | 按 Retry-After 等待后重试 |
VISITOR_MONTHLY_QUOTA_EXHAUSTED | 429 | 访客本月 1500 次免费额度已用尽 | 登录账号、购买资源包或等待下月重置 |
INTERNAL_SERVER_ERROR | 500 | 服务端内部错误 | 稍后重试,如持续出现请提供 X-Request-ID |
API_ERROR | 500 / 502 | 上游或内部错误 | 稍后重试 |
SERVICE_UNAVAILABLE | 503 | 服务暂不可用 | 指数退避后重试 |
UPSTREAM_TIMEOUT / UPSTREAM_ERROR | 500 / 502 | 上游超时或错误 | 稍后重试 |
AUTHENTICATION_REQUIRED | 401 | 接口要求登录或需要 Key | 携带 Key 后重试 |
ACCESS_DENIED | 403 | 无权限访问该资源 | 不要重试,确认业务权限 |
LEGACY_ENDPOINT_REPLACED | 4xx | 旧接口已被新接口替代 | 根据 message 中的新路径替换 |
总体上,400 / 401 / 403 / 404 属于客户端错误,应修正请求后再发起,不要直接重试;500 / 502 / 503 / 504 以及 429 属于服务端或限流错误,可以在退避后重试。
以下为常见状态码的对应处理方式:
| HTTP 状态 | 处理建议 |
|---|---|
| 200 | 成功,正常解析响应 |
| 204 | 成功,无响应体 |
| 400 | 参数错误,按 message 修正后再发,不要直接重试 |
| 401 | Key 不正确、已过期或已删除,检查 Key 后再发 |
| 402 | 仅登录用户:积分与余额均已扣完,需充值后再发 |
| 403 | 常见原因包括 CORS(跨域未带 Key)、IP 白名单不匹配、接口白名单不匹配,需检查配置 |
| 404 | 路径或资源不存在,核对 URL 与业务 ID |
| 405 | 请求方法错误,例如 GET 接口使用了 POST |
| 408 | 请求超时,可重试 |
| 409 | 资源冲突,例如重复创建同一对象 |
| 413 | 请求体过大,压缩或拆分后重试 |
| 414 | URL 过长,改用 POST 放入请求体 |
| 429 | 速率超限或额度耗尽,按 Retry-After 等待后重试 |
| 500 | 服务端异常,指数退避后重试 1–3 次 |
| 502 | 上游异常,指数退避后重试 |
| 503 | 服务暂不可用,指数退避后重试 |
| 504 | 网关超时,指数退避后重试 |
这类错误在尚未取得 HTTP 状态码前就已经失败,通常属于客户端或网络层的问题。常见情况如下:
| 错误 / code | 含义 | 处理建议 |
|---|---|---|
ERR_NETWORK | 请求未发出 | 检查网络、代理、VPN 或浏览器插件;浏览器环境下还需确认是否为 CORS 问题 |
ECONNABORTED / ETIMEDOUT | 请求超时 | 调整超时时间、更换网络或重试 |
ECONNREFUSED | 连接被拒绝 | 检查 URL 是否拼写错误 |
ENOTFOUND | 域名解析失败 | 检查 DNS 与域名拼写 |
ERR_SSL_PROTOCOL_ERROR | SSL/TLS 握手失败 | 检查系统时间是否准确,以及公司代理是否拦截 HTTPS |
INVALID_JSON_BODY | 请求体不是合法 JSON | 修正序列化逻辑 |
临时性问题通常可以重试,包括 429(按 Retry-After 等待后重试)、408、500、502、503、504,以及网络层超时类错误(如 ECONNABORTED、ETIMEDOUT)。而 400、401、402、403、404、413 属于客户端自身的问题,重试也不会成功,应当在修正后再发起。
推荐的指数退避实现如下:
JS
最关键的是响应头中的 X-Request-ID,每次请求都会返回。除此之外,还建议提供出问题请求的 URL 与请求方法(请勿包含 Key)、HTTP 状态码与返回的 JSON,以及大致的时间点(建议精确到分钟)。如果没有 X-Request-ID 也能排查,但效率会明显下降。
可以。SDK 会自动完成 HTTP 状态映射、错误对象解析、基础重试等工作,支持的语言列表见 错误处理指南,按语言安装对应包即可使用。如果使用 curl、fetch 或 requests 直接调用,则需自行按 Q31–Q35 完成字段兼容与重试逻辑。
可以长期使用。免费部分会保持免费:访客每月 1500 积分、登录用户每月 3500 积分,均在每月 1 号自动发放。资源包仅在用户主动购买时收费,不存在自动扣款,且资源包一次购买永久有效、扣完即止,没有订阅机制。
不建议。1500 积分每月的额度容易耗尽,4 QPS 的速率在并发略高时即会触发 429;访客没有账号归属,出现问题时难以定位;访客按 IP 计算,服务器 IP 变更会导致用量断档。因此生产环境至少应使用登录账号,对稳定性有要求时建议购买资源包(¥4.9 起)。
可以。在 API Keys 页面 中,可以为每个 Key 配置两类限制:速率限制(每秒、分、时或天内最多调用的次数),以及单 IP 速率限制(每个调用方 IP 在每秒、分、时或天内最多调用的次数)。
为便于统一表达,对外按"次 / 窗口"换算。例如 10 次/秒 即 10 QPS,120 次/分 相当于平均 2 QPS,86400 次/天 相当于平均 1 QPS。
如果以上内容仍未解决问题,请前往 帮助中心 提交工单,并附上响应头中的 X-Request-ID,这样会更容易定位问题。