IP 风险画像查询
识别代理、VPN、秒拨、云手机与数据中心 IP,返回风险评分、网络归属与城市级地理位置(中国地址到区县)。风险数据每 10 秒更新。
风险信号
| 信号 | 判定 | 最近捕获 |
|---|
网络归属
地理位置
最近捕获的代理类 IP
风险库最近几分钟内新捕获的代理、VPN、秒拨与云手机地址样本,每 30 秒换一批。分数答的是另一件事——此刻可核验证据的强度,随证据变旧而衰减;「刚被捕获」与「分数不高」可以同时成立。点任意一行即可查它。
五条能力
同一套判断口径:给的都是会过期的判断,不是长期标签。
各国 IP 段与风险构成
按国家与地区拆开的 IP 段归属、住宅与机房构成、主要运营商与 ASN,以及风险库近期新捕获的代理类 IP 个数。数据每日随地理库刷新。
开发者 API
同一份画像能力,供你的风控系统直接调用。基础画像与 Pulse 历史评分两个接口的参数、返回字段、认证方式与错误码,都放在独立的 接口文档 里。
https://ip99.com/v1/ip/{ip}# 直接调用,无需 Key(未登录额度)
curl https://ip99.com/v1/ip/8.8.8.8
# 带上自助创建的 Key,额度按账户计
curl -H "X-API-Key: 你的KEY" https://ip99.com/v1/ip/8.8.8.8
要查历史某个时刻的风险状态(事后复盘、对账仲裁),用 Pulse 接口的 ?at=:GET /pulse/v1/ip/{ip}?at=2026-08-26T13:34:36Z(RFC3339 时刻,可回溯 30 天,返回的 computed_at 就是你指定的那一刻)。本页这个画像接口只答此刻,不支持回溯。Pulse 接口为专业版专属:没有专业版 Key 时返回 403 professional_required,免费的基础画像仍然可以直接调 /v1/ip;需要历史能力请联系销售。
响应示例
{
"ip": "1.197.213.232",
"computed_at": "2026-08-20T14:22:31Z",
"evidence_state": "active",
"risk": { "score": 62, "level": "medium", "signals": ["dialup_pool", "proxy"] },
"network": { "asn": 4134, "usage_type": "DYN" },
"geo": { "continent": "AS", "country": "CN", "subdivision": "CN-HA", "admin_code": "411281",
"lat": 34.74509, "lon": 111.89353, "tz": "Asia/Shanghai" }
}
字段怎么读——尤其是 0 分
本接口的响应不含中文。地名、场景、风险类型一律以标准码或稳定 slug 返回(码表见下),方便贵方直接入库与统计,不必在解析层处理中文编码。
| 字段 | 含义 |
|---|---|
risk.score | 0–100。表示可核验风险证据的新鲜度与强度,随证据年龄衰减,不是「是攻击者」的概率。与 /pulse/v1/ip 的 score 同源同值——本产品对同一个 IP 只有一个分。 |
risk.level | high / medium / low / none,由 risk.score 推出(0=none,1–29=low,30–69=medium,70–100=high)。none 的意思是「我方没有当前可核验的证据」,不等于安全。0 分放行前请知道这一点。 |
computed_at | 本次评分针对的时刻。分随证据变旧而衰减,所以「算的哪一刻」是可核验的一部分:同一个 IP 隔几小时查两次分数不同是正常的。 |
evidence_state | active:有仍在计分的新鲜证据。stale:见过,但证据已过时效窗、分数为 0——可作弱特征,不宜单独作为拦截依据。none:我方从未见过——可能是覆盖盲区,不等于安全。策略平台请按这个字段分流,不要只看分数。 |
risk.signals | 命中的信号 slug 数组,只列命中的,按字典序;一个都没命中时这个键不出现(此时 risk 只剩 score 与 level)。其中 hosting / mobile 由网络场景派生,本身不是风险。逐条证据与捕获时刻见 Pulse 接口。 |
network / geo | 地址归属,与 /pulse/v1/ip 专业档同一套形状:network.asn、network.usage_type(场景码原样透传,如 IDC/DYN/MOB/GTW/EDU/GOV/CDN/ORG/DNS/NET/BOGON,完整码表与逐字段说明见 network 与 geo 逐字段);geo.continent(AS/EU/NA/SA/AF/OC/AN)、geo.country(ISO 3166-1 alpha-2)、geo.region / geo.city / geo.district(行政区的拉丁名:region / city 各国地址都会返回,中国地址也给;district 目前只有中国地址有(英文地名库对中国收录到区县、对其它国家收录到城市);库里没有的名字整个键不出现,是「库里没有」而不是 0)、geo.lat/lon/tz。中国的地址在地区名之外另给 geo.subdivision(ISO 3166-2,如 CN-ZJ)与 geo.admin_code(GB/T 2260 六位,精确到区县)。运营商名不返回——机器身份是 asn,拿它到公开注册库反查即可。 |
| 档位 | 每日配额 | 如何获得 |
|---|---|---|
| 未登录 | — | 直接调用,无需 Key |
| 免费版 | — | 登录后自助创建 API Key |
| 专业版 | 按需定制 | 在免费版字段之上增加观测天数与资源池标识(匿名句柄,同账户内稳定、跨账户不可对表),并可按历史时刻回溯评分;捕获时刻等字段另需签署数据处理协议。联系销售开通 |
| 企业版 | 按需定制 | 联系销售 |
网页查询与 API 共用同一份每日额度。未登录按公网 IP 计,登录后按账户计。专业版是数据档位,与配额档位相互独立:企业版不自动含专业版字段。以上都是调用我方的公网服务;若需要装在自己的机器上、数据完全不到我方这边,见 潮汐 Tide 或 Pulse 私有化(各自单独定价)。
响应头与错误格式
每次响应都带当日额度,不必额外查询:
| 响应头 | 含义 |
|---|---|
X-Daily-Limit | 当前档位的每日配额 |
X-Daily-Remaining | 今日剩余次数 |
X-Daily-Reset | 配额重置时间(Unix 秒,北京时间零点) |
Retry-After | 仅在 429 时出现,距可重试的秒数 |
所有错误都是同一结构,便于统一处理:
{ "error": { "code": "invalid_ip", "message": "不是合法的 IPv4/IPv6 地址:..." } }
| HTTP | code | 含义 |
|---|---|---|
| 400 | invalid_ip | 不是合法 IP |
| 400 | reserved_ip | 私有/保留地址,没有公网风险画像 |
| 401 | invalid_key | API Key 无效 |
| 401 | revoked_key | API Key 已吊销 |
| 401 | key_expired | API Key 已过期(测试期结束) |
| 404 | not_found | 接口路径不存在 |
| 429 | rate_limited | 超出每分钟速率 |
| 429 | quota_exceeded | 当日配额用尽(响应带 Retry-After) |
| 429 | quota_exceeded_anon | 未登录档当日配额用尽——登录后创建 Key 即提额 |
联系销售
需要更高配额、私有化部署或定制标签,留下联系方式,我们会尽快回复。