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

Não. Esta é uma cobertura passiva de melhor esforço. Nomes internos e hosts públicos ausentes dos conjuntos de dados das fontes não aparecerão, e a verificação DNS não procura nomes adicionais.

Use GET /v1/subdomains?domain=example.com&sources=ct. O valor ct seleciona o pipeline de compatibilidade, mas cada entrada informa sua fonte real. Falhas no modo somente cache retornam 202 e falhas de todas as fontes retornam 503. Os créditos são reembolsados nas duas respostas.

GET /v1/subdomains

Parâmetros de consulta

ParâmetroTipoDescriçã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, crtname, 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.
cursor opcional string O next_cursor da página anterior. Veja a paginação.

Casos de uso

  • 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 da resposta

CampoDescrição
subdomains[].nameNome de host retornado. O domínio raiz pode aparecer quando uma fonte o inclui.
subdomains[].sourceRevise evidências públicas de nomes de host com fontes claramente identificadas
subdomains[].first_seenAs entradas baseadas em CT informam o primeiro valor not-before do certificado encontrado. As fontes passivas alternativas podem retornar null.
subdomains[].verifiedtrue 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_recordsRegistros 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_foundNú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_countNúmero de nomes de host retornados para os quais a verificação DNS opcional encontrou um registro A ou CNAME.

Códigos de status HTTP

Códigos de status HTTPDescrição
200 OKPedido bem-sucedido
202 AceitoFalha 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álidoParâmetros inválidos
402 Pagamento necessárioNão tens créditos suficientes para executar este pedido.
503 Serviço indisponívelO serviço a montante está indisponível ou a limitar temporariamente.
504 Tempo limite do gatewayA consulta ao serviço a montante expirou.

Exemplo de requisição

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}`));

Exemplo de resposta

{
  "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 Créditos: 4-5/item

Parâmetros de consulta

Parâmetro Tipo obrigatório
dry_run string
Valores permitidos true
opcional

Parâmetros do corpo

Parâmetro Tipo obrigatório
domains string[] obrigatório
verify boolean
Padrão false
opcional
include_wildcards boolean
Padrão false
opcional
limit integer
Padrão 500
opcional

Campos da 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

Exemplo de requisição

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
}'
const response = await fetch("https://domscan.net/v1/subdomains/bulk", {
  method: "POST",
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY, "Content-Type": "application/json" },
  body: JSON.stringify({
    "domains": [
      "example.com",
      "cloudflare.com"
    ],
    "verify": false,
    "limit": 500
  }),
});
const data = await response.json();
console.log(data);
import os
import requests

response = requests.post(
    "https://domscan.net/v1/subdomains/bulk",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
    json={
        "domains": [
            "example.com",
            "cloudflare.com",
        ],
        "verify": False,
        "limit": 500,
    },
)
print(response.json())
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
)

func main() {
	body := strings.NewReader(`{
	  "domains": [
	    "example.com",
	    "cloudflare.com"
	  ],
	  "verify": false,
	  "limit": 500
	}`)
	req, err := http.NewRequest(http.MethodPost, "https://domscan.net/v1/subdomains/bulk", body)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))
	req.Header.Set("Content-Type", "application/json")

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	data, err := io.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(resp.Status, string(data))
}
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/subdomains/bulk")
request = Net::HTTP::Post.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")
request["Content-Type"] = "application/json"
request.body = JSON.generate({
  "domains" => [
    "example.com",
    "cloudflare.com"
  ],
  "verify" => false,
  "limit" => 500
})

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end
puts JSON.pretty_generate(JSON.parse(response.body))

Exemplo de resposta

{
  "results": [
    {
      "input": "example",
      "data": {}
    }
  ],
  "meta": {
    "total": 1,
    "succeeded": 1,
    "failed": 1,
    "max_items": 10,
    "credits_per_item": 1,
    "duration_ms": 1
  }
}

Códigos de status HTTP

  • 200 OK
  • 400 Pedido inválido
  • 401 Não autorizado
  • 402 Pagamento necessário
  • 409 HTTP 409
  • 422 HTTP 422
  • 429 Demasiados pedidos