开发者参考
子域查找器 API 文档
子域查找器 API 文档: 使用 Certificate Transparency (CT) 日志发现子域名。使用 prefer_cache=1 轮询缓存结果:冷缓存未命中会返回 HTTP 202,排队后台刷新,并且不消耗积分。
子域查找器
使用 Certificate Transparency (CT) 日志发现子域名。使用 prefer_cache=1 轮询缓存结果:冷缓存未命中会返回 HTTP 202,排队后台刷新,并且不消耗积分。
GET
/v1/subdomains
查询参数
| 参数 | 类型 | 说明 |
|---|---|---|
| domain 必需 | string | 查找子域的根域(例如,"github.com") |
| prefer_cache 可选 | boolean | 仅返回缓存结果。如果没有新鲜或过期缓存,API 会返回 202,排队后台刷新,并收取 0 积分。 |
| sources 可选 | string | 逗号分隔的数据源。目前仅接受 ct (Certificate Transparency)。 |
| verify 可选 | boolean | 通过DNS验证每个子域是否解析(较慢但更准确)。默认: false |
| limit 可选 | number | 返回的子域最大值。默认: 500,最大: 2000 |
使用场景
- 攻击面映射和安全审计
- 发现被遗忘或影子IT子域
- 收购前技术尽职调查
- 竞争对手基础设施分析
- 漏洞赏金侦查
响应字段
| 字段 | 说明 |
|---|---|
subdomains[].name | 发现的子域主机名 |
subdomains[].source | 数据源(例如,"ct") |
subdomains[].first_seen | 首次观察到该子域的时间 |
subdomains[].verified | 是否确认DNS解析(如果verify=true) |
subdomains[].dns_records | 找到的DNS记录(如果verify=true) |
summary.total_found | 限制前发现的子域总数 |
summary.verified_count | 验证过的(活跃)子域数 |
HTTP 状态码
| HTTP 状态码 | 说明 |
|---|---|
200 成功 | 请求成功 |
202 已接受 | 仅缓存的子域名请求未命中,已接受并在后台刷新。不收取积分;请在 Retry-After 延迟后重试。 |
400 请求错误 | 参数无效 |
402 需要付款 | 没有足够额度来执行此请求。 |
503 服务不可用 | 上游服务不可用或正在临时限流。 |
504 网关超时 | 上游查询已超时。 |
请求示例
# Find subdomains (fast, from CT logs)
curl "https://domscan.net/v1/subdomains?domain=github.com&limit=100"
# Find and verify subdomains (slower, confirms DNS resolution)
curl "https://domscan.net/v1/subdomains?domain=github.com&verify=true&limit=50"
curl "https://domscan.net/v1/subdomains?domain=github.com&prefer_cache=1"
import requests
# Enumerate subdomains with verification
response = requests.get(
"https://domscan.net/v1/subdomains",
params={
"domain": "github.com",
"verify": "true",
"limit": 100
}
)
data = response.json()
print(f"Found {data['summary']['total_found']} subdomains")
print(f"Verified: {data['summary']['verified_count']}")
# Filter to only live subdomains
live_subs = [s for s in data['subdomains'] if s['verified']]
for sub in live_subs[:10]:
print(f" {sub['name']}")
const response = await fetch(
'https://domscan.net/v1/subdomains?' + new URLSearchParams({
domain: 'github.com',
verify: 'true',
limit: '100'
})
);
const data = await response.json();
console.log(`Found ${data.summary.total_found} subdomains`);
console.log(`Verified: ${data.summary.verified_count}`);
// List verified subdomains
data.subdomains
.filter(s => s.verified)
.forEach(s => console.log(` ${s.name}`));
响应示例
{
"domain": "github.com",
"subdomains": [
{
"name": "api.github.com",
"source": "ct",
"first_seen": "2024-01-15T00:00:00Z",
"verified": true,
"dns_records": ["A 140.82.112.5"]
},
{
"name": "gist.github.com",
"source": "ct",
"first_seen": "2024-02-01T00:00:00Z",
"verified": true,
"dns_records": ["CNAME github.github.io"]
},
{
"name": "education.github.com",
"source": "ct",
"first_seen": "2023-06-10T00:00:00Z",
"verified": true,
"dns_records": ["A 185.199.108.153"]
}
],
"summary": {
"total_found": 847,
"returned": 3,
"verified_count": 3,
"unverified_count": 0,
"sources_used": ["ct"]
},
"meta": {
"query_time_ms": 1250,
"cached": false
}
}
202 已接受
{
"status": "pending",
"code": "CACHE_MISS_REFRESH_QUEUED",
"message": "Try again in a moment",
"domain": "github.com",
"retry_after": 30,
"credits_charged": 0,
"billing_status": "not_charged",
"request_id": "m8abc12-x9y8"
}