IP 查询 API 文档

接口使用 GET,返回 JSON。示例地址用于演示请求格式,实际结果以响应为准。

GET /api/check/lookup

curl 'https://ipcheak.com/api/check/lookup?ip=8.8.8.8'

可选参数 ip 接收单个公网 IPv4 或 IPv6。省略参数时解析调用方连接的公网出口;服务端调用会返回服务器出口,而不是最终用户的浏览器 IP。拒绝私网、保留地址和重复的 ip 参数。

字段说明
ip, ipVersion, source查询地址、4 / 6 版本及地址来源。
requestId, observedAt请求标识与 ISO 8601 观测时间。
networkasn、name、domain、type、prefix、registeredCountry、asnHistory;部分字段可为 null。
geo国家、地区、城市、时区及近似经纬度;不可用坐标为 null。
signalsproxy、vpn、tor、hosting、residentialProxy,取值 low / medium / high / unknown。
confidence, providers总体证据可信度与各来源的状态、观测时间和具体字段。
risk_score, risk_level, riskAnalysis风险分数(可为 null)、风险区间与组成证据。不是匿名性或安全保证。

GET /api/v1/ip/self

curl 'https://ipcheak.com/api/v1/ip/self'

查询调用方出口的精简响应:requestId、observedAt、ip、version、network、geo、signals、confidence 和 providers。此接口使用 version 字段,不包含完整查询接口的 riskAnalysis。

从服务端调用

const response = await fetch(
  'https://ipcheak.com/api/check/lookup?ip=8.8.8.8'
)
if (response.status === 429 || response.status === 503) {
  const seconds = response.headers.get('Retry-After')
  throw new Error(`Retry after ${seconds || '30'} seconds`)
}
if (!response.ok) throw new Error(`HTTP ${response.status}`)
const result = await response.json()
console.log(result.ip, result.network.asn, result.signals.vpn)

两个接口均未启用跨域浏览器访问。请处理非 2xx 响应、请求超时、缺失字段和上游来源限流;不要把 unknown 转换为 false。

频率与额度

默认同一调用方在高成本接口间共享每 60 秒 10 次、每 24 小时 100 次额度,包括 lookup、self 与扫描/诊断的高成本步骤。所有 API 另有每分钟 120 次、每天 2,000 次的调用方限制。IPv6 按 /64 网段合并计数;更换查询目标 IP 不会重置额度。窗口从首次请求起算,部署配置可调整这些默认值。

查询还受全站预算和并发上限约束。达到任一额度返回 429;服务繁忙或配额服务不可用返回 503。按 Retry-After 指定的秒数等待,不要立即重试或并发重试。成功响应的 X-RateLimit-Limit、X-RateLimit-Remaining、X-RateLimit-Reset 表示当前调用方的分钟窗口,不能据此推断全站剩余额度。缓存命中仍计入调用方额度,但不重复消耗上游查询预算。

错误与信号语义

high 表示有肯定的来源标记;medium 表示来源分歧;low 表示可用来源未标记;unknown 表示没有有效信号。即使 HTTP 返回 200,单个数据源也可能超时、限流或不可用,应读取 providers[].status。