Referência para desenvolvedores
Localizador de Subdomínio
Explore a documentação da API de Localizador de Subdomínio, os parâmetros de solicitação, os campos de resposta, os exemplos de código e o tratamento de erros para integrações com o DomScan.
Localizador de Subdomínio
Retorna um conjunto de melhor esforço de evidências públicas sobre nomes de host. O parâmetro sources=ct seleciona o pipeline de compatibilidade, que consulta primeiro o crt.sh e pode recorrer ao HackerTarget, ThreatMiner, Wayback Machine e CertSpotter. O DomScan não testa nomes por força bruta nem rastreia o site de destino. Portanto, o resultado não é um inventário completo. Falhas no modo somente cache retornam HTTP 202 e falhas de todas as fontes retornam HTTP 503. Os créditos são reembolsados nas duas respostas.
GET
/v1/subdomains
Parâmetros de Consulta
| Parâmetro | Tipo | Descrição |
|---|---|---|
| domain obrigatório | string | Domínio raiz para encontrar subdomínios (ex: "github.com") |
| prefer_cache opcional | boolean token | Serve somente resultados em cache. Se não houver cache novo nem antigo, a API retorna 202, enfileira uma atualização em segundo plano e reembolsa os créditos da solicitação. Valores aceitos: true, false, 1, 0, yes e no. Padrão: false. |
| sources opcional | string | Seletor de compatibilidade. Somente ct é aceito. Esse valor inicia o pipeline de descoberta passiva, mas cada resultado informa o provedor da evidência: crtsh, hackertarget, threatminer, wayback ou certspotter. Entradas antigas em cache podem informar ct. |
| verify opcional | boolean token | Consulta por DNS apenas os nomes já selecionados para a resposta. A verificação não descobre outros nomes. Valores aceitos: true, false, 1, 0, yes e no. Padrão: false. |
| include_wildcards opcional | boolean token | Retorna evidências de certificados wildcard em um array wildcards separado. Os wildcards não são misturados aos resultados de nomes de host concretos. Valores aceitos: true, false, 1, 0, yes e no. Padrão: false. |
| limit opcional | integer | Número máximo de entradas de nomes de host concretos a retornar. Informe um número inteiro de 1 a 2000. Padrão: 500. |
Casos de Utilização
- Mapeamento de superfície de ataque e auditorias de segurança
- Revisar possíveis nomes de host esquecidos ou de TI paralela
- Due diligence técnica pré-aquisição
- Análise competitiva de infraestrutura
- Reconhecimento de bug bounty
Campos de Resposta
| Campo | Descrição |
|---|---|
subdomains[].name | Nome de host retornado. O domínio raiz pode aparecer quando uma fonte o inclui. |
subdomains[].source | Provedor da evidência. Os valores possíveis são crtsh, hackertarget, threatminer, wayback, certspotter e ct para entradas antigas em cache. |
subdomains[].first_seen | Para evidências do crt.sh e do CertSpotter, o primeiro valor not-before válido do certificado encontrado para o nome de host. As fontes passivas alternativas retornam null porque não fornecem uma data de certificado comparável. |
subdomains[].verified | true somente quando verify está ativado e a consulta DNS do nome de host retornado encontra um registro A ou CNAME. Caso contrário, false. |
subdomains[].dns_records | Registros A ou CNAME obtidos na verificação opcional do nome de host retornado, ou null. Esse campo não adiciona nomes ao resultado. |
summary.total_found | Número total de entradas de nomes de host concretos encontradas antes do limite da resposta, incluindo o domínio raiz quando uma fonte o inclui. |
summary.verified_count | Número de nomes de host retornados para os quais a verificação DNS opcional encontrou um registro A ou CNAME. |
Códigos de Estado HTTP
| Códigos de Estado HTTP | Descrição |
|---|---|
200 OK | Pedido bem-sucedido |
202 Aceito | Falha de cache de subdomínios em modo somente cache aceita para atualização em segundo plano. Nenhum crédito é cobrado; tente novamente após o intervalo Retry-After. |
400 Pedido inválido | Parâmetros inválidos |
402 Pagamento necessário | Não tens créditos suficientes para executar este pedido. |
503 Serviço indisponível | O serviço a montante está indisponível ou a limitar temporariamente. |
504 Tempo limite do gateway | A consulta ao serviço a montante expirou. |
Pedido de Exemplo
curl -H "X-API-Key: your-api-key" "https://domscan.net/v1/subdomains?domain=example.com&sources=ct&include_wildcards=yes&limit=100"
curl -H "X-API-Key: your-api-key" "https://domscan.net/v1/subdomains?domain=example.com&sources=ct&verify=yes&limit=50"
curl -H "X-API-Key: your-api-key" "https://domscan.net/v1/subdomains?domain=example.com&prefer_cache=1"
import requests
domscan = requests.Session()
domscan.headers.update({"X-API-Key": "your-api-key"})
response = domscan.get(
"https://domscan.net/v1/subdomains",
params={
"domain": "example.com",
"sources": "ct",
"verify": "yes",
"include_wildcards": "yes",
"limit": 100
}
)
data = response.json()
print(f"Returned {data['summary']['returned']} hostname entries")
print(f"Verified: {data['summary']['verified_count']}")
live_subs = [s for s in data['subdomains'] if s['verified']]
for sub in live_subs[:10]:
print(f" {sub['name']}")
const domscanFetch = (url, options = {}) =>
fetch(url, {
...options,
headers: { ...options.headers, "X-API-Key": "your-api-key" },
});
const response = await domscanFetch(
'https://domscan.net/v1/subdomains?' + new URLSearchParams({
domain: 'example.com',
sources: 'ct',
verify: 'yes',
include_wildcards: 'yes',
limit: '100'
})
);
const data = await response.json();
console.log(`Returned ${data.summary.returned} hostname entries`);
console.log(`Verified: ${data.summary.verified_count}`);
data.subdomains
.filter(s => s.verified)
.forEach(s => console.log(` ${s.name}`));
Resposta de Exemplo
{
"domain": "example.com",
"subdomains": [
{
"name": "api.example.com",
"source": "crtsh",
"first_seen": "2025-01-15T00:00:00Z",
"verified": true,
"dns_records": {
"A": ["192.0.2.10"],
"CNAME": null
}
}
],
"wildcards": [
{
"pattern": "*.example.com",
"source": "crtsh",
"first_seen": "2024-11-20T00:00:00Z"
}
],
"summary": {
"total_found": 1,
"returned": 1,
"verified_count": 1,
"unverified_count": 0,
"sources_used": ["crtsh"],
"apex_included": false,
"wildcard_suppressed_count": 1,
"wildcard_returned_count": 1
},
"intelligence_summary": {
"data_sources": ["crtsh"],
"source_count": 1,
"cache_status": "live",
"returned_count": 1,
"total_found": 1,
"truncated": false,
"limit": 100,
"verification_requested": true,
"include_wildcards": true,
"verified_count": 1,
"verified_ratio": 1,
"live_dns_record_count": 1,
"apex_included": false,
"wildcard_suppressed_count": 1,
"wildcard_returned_count": 1,
"first_seen_oldest": "2025-01-15T00:00:00Z",
"first_seen_newest": "2025-01-15T00:00:00Z",
"warning_count": 0
},
"meta": {
"query_time_ms": 184,
"cached": false
}
}
202 Aceito
{
"status": "pending",
"code": "CACHE_MISS_REFRESH_QUEUED",
"message": "Try again in a moment",
"domain": "example.com",
"retry_after": 30,
"credits_charged": 0,
"billing_status": "not_charged",
"request_id": "m8abc12-x9y8"
}
POST
/v1/subdomains/bulk
Parâmetros do Corpo
| Parâmetro | Tipo | obrigatório |
|---|---|---|
| domains | string[] | obrigatório |
| verify | boolean | opcional |
| include_wildcards | boolean | opcional |
| limit | integer | opcional |
Campos de Resposta
| Campo | Tipo |
|---|---|
results[] |
unknown[] |
meta |
object |
meta.total |
integer |
meta.succeeded |
integer |
meta.failed |
integer |
meta.max_items |
integer |
meta.credits_per_item |
integer |
meta.duration_ms |
integer |
Pedido de Exemplo
curl -X POST "https://domscan.net/v1/subdomains/bulk" \
-H "Content-Type: application/json" \
-H "X-API-Key: $DOMSCAN_API_KEY" \
-d '{
"domains": [
"example.com",
"cloudflare.com"
],
"verify": false,
"limit": 500
}'
Resposta de Exemplo
{
"results": [
null
],
"meta": {
"total": 1,
"succeeded": 1,
"failed": 1,
"max_items": 10,
"credits_per_item": 1,
"duration_ms": 1
}
}