六种记录类型 · 周期快照 · 免费试查

被动 DNS 解析

给一个域名,返回它历史上解析到过哪些 IP、每个关系持续多久;反过来也可以——某个 IP 上还挂着谁。

普通 DNS 查询只告诉你这个域名现在指向哪里。而作恶的基础设施会换域名、换 IP、换注册商,换不掉已经发生过的关系。一个被停用的钓鱼域名,它三个月前解析到的那台服务器上,往往还挂着同一伙人的另外几十个域名。

免 Key 试查,每个 IP 每天 10 次,登录不额外增加。框里既能输域名(正查:它解析到过哪些 IP),也能输 IP 地址(反查:这个地址上还挂着哪些域名)——两条接口共用这份额度。这个框直接调本页「接入」一节的那条接口,返回的就是接入方拿到的同一份结果。

先说清楚 last_seen 是什么

这一节放在最前面,因为它是本产品最容易被读错的一个字段,而且读错的方向会让人得出完全相反的结论。

last_seen 是语料的快照截止日

我们的解析语料是周期性批量导入的快照。所以今天查任何一个活跃域名,它的 last_seen 都会落在那一期快照的日期上——看到一个月前的日期,不代表这个域名下线了,只代表本期语料在持续收录这条关系。

所以请看 corpus_last_seen

响应顶层的 corpus_last_seen 才是语料截止日。判断「这条记录有多旧」,要拿 last_seen 和它一起读。请读这个字段,不要把日期写死在代码里。

另一条链路——当日新注册域名——是每日更新的,不受这个限制;两者的时间语义不同,不要套用同一套解释。

返回什么,以及它不是什么

本接口的响应不含中文。恶意名单与落地 IP 的国家/ASN 以标准代码或稳定 slug 返回。

字段它表示什么
data[] 解析记录数组。空数组是答案,不是错误——"data": [] 表示确实没有匹配记录。参数写错不会走到这里:无效输入直接返回 400 并说明哪个参数不对。所以自动化流水线可以放心按状态码分流。
corpus_last_seen 本期语料的快照截止日。顶层字段。判断记录新旧必须读它,不要硬编码日期(见上一节)。
profile{} 域名画像对象(只有本端点有,证书端点没有)。四部分:ip_enrichment[] 是每个落地 IP 的国家 / 城市 / ASN 号 / ASN 组织;malware{} 是恶意名单命中(listed、last_listed、days_listed);record_types{} 是记录类型分布;另有 nameservers[] 与 mx[]。下面第 4、5 行说的「国家/城市/ASN」和「恶意名单」就在这个对象里。whois 目前恒为 null——我们不掌握注册者数据,不要依赖它。
domain / query 回显本次真正查的是什么。域名只接受 ASCII 字符集(字母、数字、点、连字符、下划线),国际化域名请先自己转成 punycode(xn-- 开头)再查——punycode 是纯 ASCII,能正常通过。
每条记录的域名 ↔ IP 关系 域名历史上解析到过哪些 IP,以及每个关系在本期语料里的首末出现日。六种记录类型全都在:A、AAAA、CNAME、MX、NS、TXT——不只 A 记录,所以邮件与权威服务器配置的变化也在里面。
每个落地 IP 的国家 / 城市 / ASN 一次调用同时拿到。这是「扩线」的抓手:先看域名落在哪台机器上,再反查那台机器上还挂着谁。
恶意名单命中 这个域名是否出现在我们跟踪的恶意名单里,以及最近一次命中与累计天数。做商户核验与投诉取证时,不用再拼第二份数据源。
has_more / next_offset 翻页。用 offset 翻(?offset=60):本接口没有 limit,页大小由服务端定,你控制不了,实测传 limit 会被忽略。count 是本次返回的条数,会跟着 offset 变小(某个 64 条的结果传 offset=60 就只剩 4 条)。判断有没有下一页只看 has_more。

时间是 UTC,不是北京时间

所有时间字段都是 UTC。按天聚合前记得自己加 8 小时。这个错在小窗口查询里会让你拿到一个空结果,然后以为功能坏了。

被动 DNS 是观测,不是权威

我们记录的是被观测到过的解析关系。没被观测到的不出现——一个小众域名、一个刚注册的域名,或者只在特定地区被解析的域名,可能我们就是没见过。这是覆盖盲区,不是安全证明。请把「查到了但没风险」和「根本没查到」分开处理,不要用同一个分支。

它用在哪里

诈骗域名聚类

拿到一个可疑域名,先看它落在哪个 IP,再反查那个 IP 上历史上还挂过谁。批量作案的基建很少一个 IP 只放一个域名——实测一个 CDN IP 上能反查出上千个域名。

钓鱼基建的孵化信号

「今天刚注册」与「今天刚签证书」两个集合的交集,是还没开始作案、正在搭建中的基建。这是能抢在受害者之前的那个窗口。

域名尽调与溯源

一次调用同时拿到解析史、恶意名单命中,以及每个落地 IP 的国家、城市和 ASN。做商户核验、投诉取证、事件溯源时的第一步。

追溯一台 IP 上出现过什么

反过来用:某个 IP 被判定为恶意时,看它历史上承载过哪些域名,用来圈定影响面与排查同源资产。

与证书透明度配合使用

两条线合起来才是完整的一条链:证书透明度告诉你有人刚给一个高仿域名签了证书,这是最早的信号,往往比域名解析早、比内容上线早、比任何人举报都早;被动 DNS告诉你这个域名落在哪台机器上、那台机器上还有谁。单独用任何一个,都只看得到半张图。

看证书透明度 CT →

接入

免费试查,无需注册即可调用。响应字段、额度与错误格式见 API 接口文档;证书侧见 证书透明度 CT。

GEThttps://ip99.com/v1/domain/dns/{domain}
# 直接调用,无需 Key(未登录额度)
curl https://ip99.com/v1/domain/dns/example.com

# 翻页用 offset(本接口没有 limit,页大小由服务端定)
curl "https://ip99.com/v1/domain/dns/example.com?offset=60"

域名要小写、去尾点,非 ASCII 域名用 punycode。判断有没有下一页只看 has_more;offset 只接受非负整数,写错会得到 400。回填任务运行期间同一查询耗时会在 1–5 秒之间波动(基线约 1 秒),这不是故障。

GEThttps://ip99.com/v1/domain/registered/{date}
# 某一日新增注册的域名(按域名排序),同样无需 Key
curl https://ip99.com/v1/domain/registered/2026-10-08

这就是上面那条「每日更新」的链路。日期必须是 YYYY-MM-DD 形式的真实日期:写成 2026-13-45 会得到 400,不会静默回一个空列表。每条记录是 domain、ip、registrar、country。这条接口不支持翻页——一次给按域名排序的前 1000 条,带上 offset 会得到 400 pagination_unsupported;所以响应里没有 has_more 与 next_offset 这两个字段,别按它们写循环。查一个还没有数据的日期回的是空数组(那是答案,不是错误)。

GEThttps://ip99.com/v1/domain/malware/{domain}
# 恶意名单核验:这个域名被列入过哪些日期,无需 Key
curl https://ip99.com/v1/domain/malware/starglobalbank.com

与 DNS 响应里的 profile.malware 是同一份数据,只是问得更轻(毫秒级,适合流水线逐条核验):这里给的是列入日期的清单,画像那边给的是汇总(listed、last_listed、days_listed)。命中与未命中都是 200——判定看 data 是否为空,不要看状态码。这一条也不带翻页字段。

GEThttps://ip99.com/v1/domain/reverse/{ip}
# IP 反查:这个 IP 历史上解析到过哪些域名,无需 Key
curl "https://ip99.com/v1/domain/reverse/104.21.5.141"

正查回答「这个域名解析到过哪些地址」,反查回答反方向的问题,读的是同一份被动 DNS 语料。每行是 domain、rrtype、first_seen、last_seen;一次最多 1000 条,有翻页(看 has_more 与 next_offset,接着取用 ?offset=N)。{ip} 只收裸地址(8.8.8.8 或 2606:4700:4700::1111):写成 8.8.8.8:443 或 8.8.8.8/32 这类带端口、掩码的形式会被拒——去掉端口与掩码再查。私有地址不是错误——10.0.0.1 这类值在 DNS 记录里真实存在。它是全表查询,最多等 25 秒;这条与上面几张卡共用同一份免 Key 试用额度。

覆盖与更新

覆盖范围

覆盖 A、AAAA、CNAME、MX、NS、TXT 六种记录类型,每条带首次与最近观测日期。语料周期性批量导入,截止日见响应顶层的 corpus_last_seen。

延迟在回填期间会波动

有一项后台回填任务与查询抢同一套 CPU 和磁盘,所以耗时在 1–5 秒之间波动,基线约一秒。这不是故障,回填结束后会回到稳定的一秒级。

⚠️ 这一段说的是域名正查(一个域名解析到过哪些 IP)。反查(IP → 域名)也已经开放:见 GET /v1/domain/reverse/{ip},它是全表查询,我们最多等 25 秒。

边界:反查开放到什么程度

正查(域名 → IP)是查一个域名自己的历史;反查(IP → 域名清单)方向相反——它等于一份现成的资产地图,所以我们按下面的界限开放(反查一次最多 1000 条,可以翻页):

内容是否公开原因
某个域名的解析史(IP、首末观测日、记录类型) 公开 这是产品本身要回答的问题,且只涉及这一个域名的历史。
聚合信息:解析过多少个 IP、关系持续多久 公开 足够回答「这个域名的托管稳不稳定」。
某个 IP 上的域名清单(反查,逐页返回) 公开 一次最多 1000 条,用 ?offset= 接着取。它是全表查询,比正查慢(秒级),我们最多等 25 秒。
一次性全量导出(把某个 IP 或一批 IP 的清单打包带走) 本接口不提供 接口是按页给的,没有导出这个动作。需要接进自己的内网、或做批量监控,请联系销售。
某一天新增注册域名的完整清单 本接口不提供 那条清单按域名排序,一次只提供前 1000 条,也没有可用的翻页参数;这一天剩下的部分本接口给不出。要按天拿全量,请联系我们。
数据来源与来源名称 绝不 来源构成是商业信息,任何客户面都不披露。

我们不做主动探测,也不做子域爆破

本接口不做主动 DNS 查询、不扫子域、不做爆破。它只回答我方被动观测到过什么。子域的信息请走证书透明度日志——那是另一个数据源、另一套边界。

联系销售

需要批量域名监控、把反查结果接进自己的内网,或要按天取全量新增清单,告诉我们场景与大致量级即可。

填写联系表单 →