IP 风险画像查询
识别代理、VPN、秒拨、云手机与数据中心 IP,返回风险评分、网络归属与区县级地理位置。风险数据每 10 秒更新。
风险信号
| 信号 | 判定 | 最近捕获 |
|---|
网络归属
地理位置
最近实测到的代理出口
我方探针在过去一小时内确认仍在工作的出口。分数答的是另一件事——此刻可核验证据的强度,随证据变旧而衰减;「刚确认还在工作」与「分数不高」可以同时成立。点任意一行即可查它。
三条能力
同一套判断口径:给的都是会过期的判断,不是长期标签。
各国 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",
"risk": {
"score": 62, "level": "medium", "tags": ["proxy", "dialup_pool"],
"tag_details": [
{ "tag": "proxy", "last_seen": "2026-08-20T10:51:05+08:00" },
{ "tag": "dialup_pool", "last_seen": "2026-08-14T10:51:05+08:00" }
]
},
"evidence_state": "active",
"computed_at": "2026-08-20T14:22:31Z",
"signals": { "proxy": true, "vpn": false, "dialup_pool": true, "hijacked_proxy": false,
"osint": false, "crawler": false, "cloud_service": false, "cloud_phone": false,
"hosting": false, "mobile": false },
"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.tag_details[].last_seen | 该类证据最近一次捕获的时刻,RFC3339 格式并带时区偏移(如 2026-08-20T10:51:05+08:00)。标签可能仍在而分数已衰减到 0——那表示证据已过期,不表示该 IP 干净。判定时以 last_seen 距今多久为准。 |
signals.* | 布尔信号。hosting / mobile 由网络场景派生,本身不是风险;其余与 tags 一一对应。 |
network / geo | 地址归属,与 /pulse/v1/ip 专业档同一套形状:network.asn、network.usage_type(IDC/DYN/MOB/GTW/EDU/GOV/CDN/ORG/DNS/NET/COM/BOGON);geo.continent(AS/EU/NA/SA/AF/OC/AN)、geo.country(ISO 3166-1 alpha-2)、geo.lat/lon/tz。中国的地址给 geo.subdivision(ISO 3166-2,如 CN-ZJ)与 geo.admin_code(GB/T 2260 六位,精确到区县);其余国家给 geo.region / geo.city 拉丁名。运营商名不返回——机器身份是 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 即提额 |
meta.query_us 是服务端查询耗时(微秒)。
query_ms 同时保留,但本站查询通常在 1 毫秒以内,它基本恒为 0。
联系销售
需要更高配额、私有化部署或定制标签,留下联系方式,我们会尽快回复。