> For the complete documentation index see https://domscan.net/llms.txt. Markdown versions of every docs page are available by appending .md to the page URL.

Source: https://domscan.net/pt/docs/ssl-certificates

# Certificados SSL

API da DomScan: Consulte logs de Transparência de Certificado para monitorar certificados SSL/TLS emitidos para qualquer domínio.

Consulte logs de Transparência de Certificado para monitorar certificados SSL/TLS emitidos para qualquer domínio. Detecte certificados não autorizados, rastreie renovações de certificado e garanta conformidade de segurança.

GET /v1/certificates

#### Parâmetros de consulta

| Parâmetro | Tipo | Descrição |
| --- | --- | --- |
| domain obrigatório | string | Domínio ou hostname para pesquisar certificados (ex: "github.com" ou "api.github.com") |
| include_subdomains opcional | boolean Padrão `true` | Incluir certificados de wildcard e subdomínio (padrão: true) |
| include_expired opcional | boolean Padrão `false` | Incluir certificados que já expiraram. |
| limit opcional | integer Padrão `100` | Certificados a retornar por página, até 1000. |
| cursor opcional | string | O `next_cursor` da página anterior. Veja a [paginação](https://domscan.net/docs/response-format#pagination). |

#### Casos de uso

- Enumeração de subdomínio via campos SAN de certificado

- Detectar emissão de certificado não autorizado

- Monitorar certificados de phishing

- Auditar datas de expiração de certificado

#### Exemplo de requisição

```bash
curl -H "X-API-Key: your-api-key" "https://domscan.net/v1/certificates?domain=github.com&include_subdomains=true"
```

```python
import requests

domscan = requests.Session()
domscan.headers.update({"X-API-Key": "your-api-key"})

response = domscan.get(
    "https://domscan.net/v1/certificates",
    params={"domain": "github.com", "include_subdomains": "true"}
)
data = response.json()

# Extract unique subdomains from certificates
subdomains = set()
for cert in data['certificates']:
    for name in cert.get('names', []):
        if name.endswith('.github.com'):
            subdomains.add(name)

print(f"Found {len(subdomains)} subdomains")
for subdomain in sorted(subdomains)[:10]:
    print(f"  {subdomain}")
```

#### Exemplo de resposta

```json
{
  "domain": "github.com",
  "certificates": [
                {
                "issuer": "Let's Encrypt",
                "common_name": "example.com",
                "san": ["example.com", "www.example.com"],
                "not_before": "2024-01-01T00:00:00Z",
                "not_after": "2024-04-01T00:00:00Z"
                }
                ],
                "total": 1
                }
```

#### Campos da resposta

| Campo | Tipo |
| --- | --- |
| `has_more` | boolean |
| `next_cursor` | string \| null |
| `cache_age_s` | integer |
| `domain` | string |
| `certificates[]` | object[] |
| `certificates[]` | object |
| `certificates[].id` | string |
| `certificates[].issuer` | object |
| `certificates[].common_name` | string |
| `certificates[].san[]` | string[] |
| `certificates[].not_before` | string |
| `certificates[].not_after` | string |
| `certificates[].is_expired` | boolean |
| `certificates[].is_wildcard` | boolean |
| `certificates[].fingerprint_sha256` | string |
| `summary` | object |
| `summary.total_found` | integer |
| `summary.returned` | integer |
| `summary.unique_subdomains` | integer |
| `summary.issuers[]` | string[] |
| `summary.earliest_cert` | string \| null |
| `summary.latest_cert` | string \| null |
| `pagination` | object |
| `pagination.limit` | integer |
| `pagination.offset` | integer |
| `pagination.returned` | integer |
| `pagination.total` | integer |
| `pagination.has_more` | boolean |
| `pagination.next_cursor` | string \| null |
| `intelligence_summary` | object |
| `intelligence_summary.data_source` | string |
| `intelligence_summary.ct_log_sources[]` | string[] |
| `intelligence_summary.source_count` | integer |
| `intelligence_summary.cache_status` | string |
| `intelligence_summary.returned_count` | integer |
| `intelligence_summary.total_found` | integer |
| `intelligence_summary.truncated` | boolean |
| `intelligence_summary.limit` | integer |
| `intelligence_summary.include_subdomains` | boolean |
| `intelligence_summary.include_expired` | boolean |
| `intelligence_summary.unique_name_count` | integer |
| `intelligence_summary.unique_subdomains` | integer |
| `intelligence_summary.issuer_count` | integer |
| `intelligence_summary.wildcard_cert_count` | integer |
| `intelligence_summary.active_cert_count` | integer |
| `intelligence_summary.expired_cert_count` | integer |
| `intelligence_summary.expiring_within_30_days_count` | integer |
| `intelligence_summary.earliest_cert` | string \| null |
| `intelligence_summary.latest_cert` | string \| null |
| `intelligence_summary.latest_expiry` | string \| null |
| `intelligence_summary.has_more` | boolean |
| `intelligence_summary.next_cursor` | string \| null |
| `intelligence_summary.warning_code` | string \| null |
| `meta` | object |

GET /v1/ssl/audit Créditos: 5

#### Parâmetros de consulta

| Parâmetro | Tipo | obrigatório |
| --- | --- | --- |
| domain | string | obrigatório |

#### Campos da resposta

| Campo | Tipo |
| --- | --- |
| `domain` | string |
| `classification` | object |
| `classification.status` | string |
| `classification.reason` | string |
| `classification.evidence` | object |
| `classification.evidence.source` | string |
| `classification.evidence.method` | string |
| `classification.evidence.observed_at` | string |
| `classification.evidence.detail` | string |
| `classification.checked_at` | string |
| `audit_completeness` | string |
| `probe_coverage` | object |
| `probe_coverage.tls_inspect` | boolean |
| `probe_coverage.tls_audit` | boolean |
| `probe_coverage.tls_posture` | boolean |
| `probe_coverage.revocation` | boolean |
| `probe_coverage.hsts` | boolean |
| `probe_coverage.http_versions` | boolean |
| `certificate` | object |
| `certificate.subject` | string |
| `certificate.issuer` | string |
| `certificate.issuer_org` | string |
| `certificate.valid_from` | string |
| `certificate.valid_until` | string |
| `certificate.days_remaining` | integer |
| `certificate.expired` | boolean |
| `certificate.san[]` | string[] |
| `certificate.key_type` | string |
| `certificate.key_size` | integer |
| `certificate.signature_algorithm` | string |
| `certificate.serial_number` | string |
| `certificate.fingerprint_sha256` | string |
| `certificate.hostname_match` | boolean \| null |
| `chain` | object |
| `chain.length` | integer |
| `chain.valid` | boolean |
| `chain.certificates[]` | object[] |
| `chain.certificates[]` | object |
| `chain.certificates[].subject` | string |
| `chain.certificates[].issuer` | string |
| `chain.certificates[].type` | string |
| `chain.certificates[].valid_from` | string \| null |
| `chain.certificates[].valid_until` | string \| null |
| `chain.issues[]` | string[] |
| `protocols` | object |
| `protocols.tls_1_3` | boolean |
| `protocols.tls_1_2` | boolean |
| `protocols.tls_1_1` | boolean |
| `protocols.tls_1_0` | boolean |
| `protocols.ssl_3` | boolean |
| `protocols.preferred_protocol` | string |
| `protocols.detection_method` | string |
| `protocols.deprecated_protocols_enabled` | boolean |
| `connection` | object |
| `connection.preferred_protocol` | string \| null |
| `connection.preferred_cipher` | string \| null |
| `connection.alpn_negotiated` | string \| null |
| `connection.forward_secrecy` | boolean |
| `connection.forward_secrecy_cipher` | string \| null |
| `connection.secure_renegotiation_supported` | boolean \| null |
| `connection.server_temp_key` | string \| null |
| `connection.peer_signing_digest` | string \| null |
| `connection.peer_signature_type` | string \| null |
| `connection.server_public_key_bits` | integer \| null |
| `connection.compression` | string \| null |
| `connection.expansion` | string \| null |
| `connection.client_certificate_requested` | boolean \| null |
| `certificate_delivery` | object |
| `certificate_delivery.must_staple` | boolean |
| `certificate_delivery.sct_embedded` | boolean |
| `certificate_delivery.sct_count` | integer |
| `certificate_delivery.ocsp_stapling_present` | boolean |
| `certificate_delivery.ocsp_stapling_fresh` | boolean \| null |
| `certificate_delivery.ocsp_stapling_status` | string \| null |
| `certificate_delivery.ocsp_this_update` | string \| null |
| `certificate_delivery.ocsp_next_update` | string \| null |
| `handshake_size` | object |
| `handshake_size.chain_certificate_count` | integer |
| `handshake_size.estimated_certificate_bytes` | integer |
| `handshake_size.estimated_handshake_bytes` | integer |
| `handshake_size.risk` | string |
| `handshake_size.mobile_client_warning` | boolean |
| `alpn_summary` | object |
| `alpn_summary.negotiated_protocol` | string \| null |
| `alpn_summary.http2_ready` | boolean \| null |
| `alpn_summary.http3_advertised` | boolean \| null |
| `alpn_summary.fallback_protocols[]` | string[] |
| `alpn_summary.evidence_sources[]` | string[] |
| `transport` | object |
| `transport.hsts` | object |
| `transport.hsts.reachable` | boolean |
| `transport.hsts.final_url` | string \| null |
| `transport.hsts.status_code` | integer \| null |
| `transport.hsts.header_present` | boolean |
| `transport.hsts.hsts_header` | string \| null |
| `transport.hsts.max_age` | integer \| null |
| `transport.hsts.include_subdomains` | boolean \| null |
| `transport.hsts.preload_directive` | boolean \| null |
| `transport.hsts.preload_eligible` | boolean |
| `transport.hsts.preload_status` | string \| null |
| `transport.hsts.preloaded_domain` | string \| null |
| `transport.hsts.issues[]` | string[] |
| `transport.hsts.errors[]` | string[] |
| `transport.http_versions` | object |
| `transport.http_versions.http1_1` | boolean |
| `transport.http_versions.http2` | boolean |
| `transport.http_versions.http3` | boolean |
| `transport.http_versions.alt_svc` | string \| null |
| `transport.http_versions.http3_advertised` | boolean |
| `transport.http_versions.alt_svc_protocols[]` | string[] |
| `transport.http_versions.curl_http3_supported` | boolean |
| `revocation` | object |
| `revocation.ocsp` | object |
| `revocation.ocsp.present` | boolean |
| `revocation.ocsp.uris[]` | string[] |
| `revocation.ocsp.checked_uri` | string \| null |
| `revocation.ocsp.status` | string \| null |
| `revocation.ocsp.verify_ok` | boolean |
| `revocation.ocsp.this_update` | string \| null |
| `revocation.ocsp.next_update` | string \| null |
| `revocation.ocsp.error` | string \| null |
| `revocation.crl` | object |
| `revocation.crl.present` | boolean |
| `revocation.crl.uris[]` | string[] |
| `revocation.crl.checked_uri` | string \| null |
| `revocation.crl.fetched` | boolean |
| `revocation.crl.http_status` | integer \| null |
| `revocation.crl.revoked` | boolean \| null |
| `revocation.crl.last_update` | string \| null |
| `revocation.crl.next_update` | string \| null |
| `revocation.crl.revoked_serial_count` | integer \| null |
| `revocation.crl.error` | string \| null |
| `tls_extensions[]` | string[] |
| `edge_summary` | object |
| `edge_summary.relay_configured` | boolean |
| `edge_summary.evidence_sources[]` | string[] |
| `edge_summary.probe_success_count` | integer |
| `edge_summary.probe_attempt_count` | integer |
| `edge_summary.live_handshake_ms` | integer \| null |
| `edge_summary.strongest_protocol` | string \| null |
| `edge_summary.weakest_supported_protocol` | string \| null |
| `edge_summary.deprecated_protocol_count` | integer |
| `edge_summary.http3_ready` | boolean |
| `edge_summary.hsts_preload_ready` | boolean |
| `edge_summary.revocation_checked` | boolean |
| `edge_summary.revocation_good` | boolean \| null |
| `edge_summary.certificate_transparency_ready` | boolean |
| `edge_summary.client_auth_requested` | boolean \| null |
| `edge_summary.weak_transport_detected` | boolean |
| `issues[]` | string[] |
| `recommendations[]` | string[] |
| `checked_at` | string |
| `check_duration_ms` | integer |

#### Exemplo de requisição

```bash
curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/ssl/audit?domain=example.com"
```

```javascript
const response = await fetch("https://domscan.net/v1/ssl/audit?domain=example.com", {
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);
```

```python
import os
import requests

response = requests.get(
    "https://domscan.net/v1/ssl/audit?domain=example.com",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())
```

```go
package main

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/ssl/audit?domain=example.com", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))

```ruby
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/ssl/audit?domain=example.com")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")

#### Exemplo de resposta

```json
{
  "domain": "cloudflare.com",
  "audit_completeness": "full",
  "probe_coverage": {
    "tls_inspect": true,
    "tls_audit": true,
    "tls_posture": true,
    "revocation": true,
    "hsts": true,
    "http_versions": true
  },
  "certificate": {
    "subject": "cloudflare.com",
    "issuer": "Google Trust Services",
    "valid_from": "2026-03-01T00:00:00Z",
    "valid_until": "2026-05-30T23:59:59Z",
    "days_remaining": 42,
    "expired": false,
    "san": [
      "cloudflare.com",
      "*.cloudflare.com"
    ],
    "key_type": "ECDSA",
    "key_size": 256,
    "signature_algorithm": "ecdsaWithSHA256",
    "serial_number": "539933F4CFE7E8CF13F5E60D139675A1",
    "fingerprint_sha256": "AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99",
    "hostname_match": true
  },
  "chain": {
    "length": 3,
    "valid": true,
    "certificates": [
      {
        "subject": "cloudflare.com",
        "issuer": "Google Trust Services",
        "type": "leaf"
      },
      {
        "subject": "Google Trust Services",
        "issuer": "GlobalSign",
        "type": "intermediate"
      },
      {
        "subject": "GlobalSign",
        "issuer": "GlobalSign",
        "type": "root"
      }
    ],
    "issues": []
  },
  "protocols": {
    "tls_1_3": true,
    "tls_1_2": true,
    "tls_1_1": false,
    "tls_1_0": false,
    "ssl_3": false,
    "preferred_protocol": "TLSv1.3",
    "detection_method": "active",
    "deprecated_protocols_enabled": false
  },
  "connection": {
    "preferred_protocol": "TLSv1.3",
    "preferred_cipher": "TLS_AES_256_GCM_SHA384",
    "alpn_negotiated": "h2",
    "forward_secrecy": true,
    "forward_secrecy_cipher": "TLS_AES_256_GCM_SHA384",
    "secure_renegotiation_supported": false,
    "server_temp_key": "X25519, 253 bits",
    "peer_signing_digest": "SHA256",
    "peer_signature_type": "ECDSA",
    "server_public_key_bits": 256,
    "compression": "NONE",
    "expansion": "NONE",
    "client_certificate_requested": false
  },
  "certificate_delivery": {
    "must_staple": false,
    "sct_embedded": true,
    "sct_count": 2,
    "ocsp_stapling_present": true,
    "ocsp_stapling_fresh": true,
    "ocsp_stapling_status": "successful (0x0)",
    "ocsp_this_update": "2026-04-15T02:35:16Z",
    "ocsp_next_update": "2026-04-22T01:35:15Z"
  },
  "handshake_size": {
    "chain_certificate_count": 3,
    "estimated_certificate_bytes": 3200,
    "estimated_handshake_bytes": 4600,
    "risk": "low",
    "mobile_client_warning": false
  },
  "alpn_summary": {
    "negotiated_protocol": "h2",
    "http2_ready": true,
    "http3_advertised": true,
    "fallback_protocols": [
      "TLSv1.3",
      "TLSv1.2",
      "http/1.1"
    ],
    "evidence_sources": [
      "tls_audit",
      "http_versions"
    ]
  },
  "transport": {
    "hsts": {
      "reachable": true,
      "final_url": "https://cloudflare.com/",
      "status_code": 200,
      "header_present": true,
      "hsts_header": "max-age=31536000; includeSubDomains",
      "max_age": 31536000,
      "include_subdomains": true,
      "preload_directive": false,
      "preload_eligible": true,
      "preload_status": "preloaded",
      "preloaded_domain": "cloudflare.com",
      "issues": [
        "missing preload directive"
      ],
      "errors": []
    },
    "http_versions": {
      "http1_1": true,
      "http2": true,
      "http3": true,
      "alt_svc": "h3=\":443\"; ma=86400",
      "http3_advertised": true,
      "alt_svc_protocols": [
        "h3"
      ],
      "curl_http3_supported": true
    }
  },
  "revocation": {
    "ocsp": {
      "present": true,
      "uris": [
        "http://o.pki.goog/wr2"
      ],
      "checked_uri": "http://o.pki.goog/wr2",
      "status": "good",
      "verify_ok": true,
      "this_update": "2026-04-18T20:30:00Z",
      "next_update": "2026-04-19T20:30:00Z",
      "error": null
    },
    "crl": {
      "present": true,
      "uris": [
        "http://c.pki.goog/wr2.crl"
      ],
      "checked_uri": "http://c.pki.goog/wr2.crl",
      "fetched": true,
      "http_status": 200,
      "revoked": false,
      "last_update": "2026-04-17T00:00:00Z",
      "next_update": "2026-04-24T00:00:00Z",
      "revoked_serial_count": 0,
      "error": null
    }
  },
  "tls_extensions": [
    "key share",
    "supported versions",
    "server name"
  ],
  "edge_summary": {
    "relay_configured": true,
    "evidence_sources": [
      "tls_inspect",
      "tls_audit",
      "tls_posture",
      "revocation",
      "hsts",
      "http_versions"
    ],
    "probe_success_count": 6,
    "probe_attempt_count": 6,
    "live_handshake_ms": 51,
    "strongest_protocol": "TLSv1.3",
    "weakest_supported_protocol": "TLSv1.2",
    "deprecated_protocol_count": 0,
    "http3_ready": true,
    "hsts_preload_ready": true,
    "revocation_checked": true,
    "revocation_good": true,
    "certificate_transparency_ready": true,
    "client_auth_requested": false,
    "weak_transport_detected": false
  },
  "issues": [],
  "recommendations": [
    "Add the preload directive if you want HSTS preload-list eligibility."
  ],
  "checked_at": "2026-04-18T21:00:00Z",
  "check_duration_ms": 512
}
```

#### Códigos de status HTTP

- `200` OK
- `400` Pedido inválido
- `401` Não autorizado
- `402` Pagamento necessário
- `429` Demasiados pedidos

GET /v1/ssl/deep-scan Créditos: 10

#### Parâmetros de consulta

| Parâmetro | Tipo | obrigatório |
| --- | --- | --- |
| domain | string | obrigatório |
| refresh | boolean Padrão `false` | opcional |
| profile | string Valores permitidos `standard`, `full` Padrão `standard` | opcional |

#### Campos da resposta

| Campo | Tipo |
| --- | --- |
| `cache_age_s` | integer |
| `status` | string |
| `domain` | string |
| `host` | string |
| `port` | integer |
| `profile` | string |
| `scan_token` | string |
| `message` | string |
| `poll_after_ms` | integer |
| `cache` | object |
| `cache.hit` | boolean |
| `cache.fresh` | boolean |
| `cache.started_at` | string \| null |
| `cache.completed_at` | string \| null |
| `cache.expires_at` | string \| null |
| `cache.engine` | string \| null |
| `cache.profile` | string \| null |
| `result` | object |
| `result.domain` | string |
| `result.host` | string |
| `result.port` | integer |
| `result.engine` | object |
| `result.engine.name` | string |
| `result.engine.mode` | string |
| `result.engine.version` | string \| null |
| `result.engine.profile` | string |
| `result.target` | object |
| `result.target.ip` | string \| null |
| `result.target.service` | string \| null |
| `result.target.rdns` | string \| null |
| `result.summary` | object |
| `result.summary.severity_counts` | object |
| `result.summary.severity_counts.critical` | integer |
| `result.summary.severity_counts.high` | integer |
| `result.summary.severity_counts.medium` | integer |
| `result.summary.severity_counts.low` | integer |
| `result.summary.severity_counts.warn` | integer |
| `result.summary.severity_counts.info` | integer |
| `result.summary.severity_counts.ok` | integer |
| `result.summary.actionable_findings` | integer |
| `result.summary.protocols_offered[]` | string[] |
| `result.summary.deprecated_protocols[]` | string[] |
| `result.summary.supports_tls_1_3` | boolean \| null |
| `result.summary.supports_http2` | boolean \| null |
| `result.summary.supports_http3` | boolean \| null |
| `result.sections` | object |
| `result.sections.pretest[]` | object[] |
| `result.sections.pretest[]` | object |
| `result.sections.pretest[].id` | string |
| `result.sections.pretest[].severity` | string |
| `result.sections.pretest[].finding` | string |
| `result.sections.pretest[].cve` | string |
| `result.sections.pretest[].cwe` | string |
| `result.sections.protocols[]` | object[] |
| `result.sections.protocols[]` | object |
| `result.sections.protocols[].id` | string |
| `result.sections.protocols[].severity` | string |
| `result.sections.protocols[].finding` | string |
| `result.sections.protocols[].cve` | string |
| `result.sections.protocols[].cwe` | string |
| `result.sections.server_defaults[]` | object[] |
| `result.sections.server_defaults[]` | object |
| `result.sections.server_defaults[].id` | string |
| `result.sections.server_defaults[].severity` | string |
| `result.sections.server_defaults[].finding` | string |
| `result.sections.server_defaults[].cve` | string |
| `result.sections.server_defaults[].cwe` | string |
| `result.sections.server_preferences[]` | object[] |
| `result.sections.server_preferences[]` | object |
| `result.sections.server_preferences[].id` | string |
| `result.sections.server_preferences[].severity` | string |
| `result.sections.server_preferences[].finding` | string |
| `result.sections.server_preferences[].cve` | string |
| `result.sections.server_preferences[].cwe` | string |
| `result.sections.cipher_categories[]` | object[] |
| `result.sections.cipher_categories[]` | object |
| `result.sections.cipher_categories[].id` | string |
| `result.sections.cipher_categories[].severity` | string |
| `result.sections.cipher_categories[].finding` | string |
| `result.sections.cipher_categories[].cve` | string |
| `result.sections.cipher_categories[].cwe` | string |
| `result.sections.forward_secrecy[]` | object[] |
| `result.sections.forward_secrecy[]` | object |
| `result.sections.forward_secrecy[].id` | string |
| `result.sections.forward_secrecy[].severity` | string |
| `result.sections.forward_secrecy[].finding` | string |
| `result.sections.forward_secrecy[].cve` | string |
| `result.sections.forward_secrecy[].cwe` | string |
| `result.sections.vulnerabilities[]` | object[] |
| `result.sections.vulnerabilities[]` | object |
| `result.sections.vulnerabilities[].id` | string |
| `result.sections.vulnerabilities[].severity` | string |
| `result.sections.vulnerabilities[].finding` | string |
| `result.sections.vulnerabilities[].cve` | string |
| `result.sections.vulnerabilities[].cwe` | string |
| `result.sections.browser_simulations[]` | object[] |
| `result.sections.browser_simulations[]` | object |
| `result.sections.browser_simulations[].id` | string |
| `result.sections.browser_simulations[].severity` | string |
| `result.sections.browser_simulations[].finding` | string |
| `result.sections.browser_simulations[].cve` | string |
| `result.sections.browser_simulations[].cwe` | string |
| `result.sections.rating[]` | object[] |
| `result.sections.rating[]` | object |
| `result.sections.rating[].id` | string |
| `result.sections.rating[].severity` | string |
| `result.sections.rating[].finding` | string |
| `result.sections.rating[].cve` | string |
| `result.sections.rating[].cwe` | string |
| `result.findings[]` | object[] |
| `result.findings[]` | object |
| `result.findings[].section` | string |
| `result.findings[].id` | string |
| `result.findings[].severity` | string |
| `result.findings[].finding` | string |
| `result.findings[].cve` | string |
| `result.findings[].cwe` | string |
| `result.checked_at` | string |
| `result.scan_duration_ms` | integer |
| `result.notes[]` | string[] |
| `error` | object |
| `error.message` | string |
| `error.retryable` | boolean |

#### Exemplo de requisição

```bash
curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/ssl/deep-scan?domain=openai.com&refresh=false&profile=standard"
```

```javascript
const response = await fetch("https://domscan.net/v1/ssl/deep-scan?domain=openai.com&refresh=false&profile=standard", {
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);
```

```python
import os
import requests

response = requests.get(
    "https://domscan.net/v1/ssl/deep-scan?domain=openai.com&refresh=false&profile=standard",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())
```

```go
package main

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/ssl/deep-scan?domain=openai.com&refresh=false&profile=standard", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))

```ruby
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/ssl/deep-scan?domain=openai.com&refresh=false&profile=standard")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")

#### Exemplo de resposta

```json
{
  "status": "ready",
  "domain": "openai.com",
  "host": "openai.com",
  "port": 443,
  "profile": "full",
  "scan_token": "eyJrIjoidGxzLWRlZXAtc2NhbiIsImkiOiJleGFtcGxlIiwiaCI6Im9wZW5haS5jb20ifQ",
  "cache": {
    "hit": true,
    "fresh": true,
    "completed_at": "2026-04-18T22:10:00Z",
    "expires_at": "2026-04-19T22:10:00Z",
    "engine": "testssl.sh",
    "profile": "full"
  },
  "result": {
    "domain": "openai.com",
    "host": "openai.com",
    "port": 443,
    "engine": {
      "name": "testssl.sh",
      "mode": "testssl",
      "version": "3.3dev",
      "profile": "full"
    },
    "target": {
      "ip": "172.64.154.211",
      "service": "HTTP",
      "rdns": "--"
    },
    "summary": {
      "severity_counts": {
        "critical": 0,
        "high": 1,
        "medium": 1,
        "low": 0,
        "warn": 1,
        "info": 6,
        "ok": 4
      },
      "actionable_findings": 3,
      "protocols_offered": [
        "TLS1_2",
        "TLS1_3"
      ],
      "deprecated_protocols": [],
      "supports_tls_1_3": true,
      "supports_http2": true,
      "supports_http3": null
    },
    "sections": {
      "pretest": [],
      "protocols": [
        {
          "id": "TLS1_2",
          "severity": "OK",
          "finding": "offered"
        },
        {
          "id": "TLS1_3",
          "severity": "OK",
          "finding": "offered with final"
        },
        {
          "id": "QUIC",
          "severity": "WARN",
          "finding": "not tested due to lack of local OpenSSL support"
        }
      ],
      "server_defaults": [
        {
          "id": "early_data",
          "severity": "HIGH",
          "finding": "supported"
        }
      ],
      "server_preferences": [],
      "cipher_categories": [],
      "forward_secrecy": [],
      "vulnerabilities": [
        {
          "id": "BREACH",
          "severity": "MEDIUM",
          "finding": "potentially VULNERABLE, br gzip HTTP compression detected",
          "cve": "CVE-2013-3587",
          "cwe": "CWE-310"
        }
      ],
      "browser_simulations": [],
      "rating": []
    },
    "findings": [
      {
        "section": "protocols",
        "id": "QUIC",
        "severity": "WARN",
        "finding": "not tested due to lack of local OpenSSL support"
      },
      {
        "section": "server_defaults",
        "id": "early_data",
        "severity": "HIGH",
        "finding": "supported"
      },
      {
        "section": "vulnerabilities",
        "id": "BREACH",
        "severity": "MEDIUM",
        "finding": "potentially VULNERABLE, br gzip HTTP compression detected",
        "cve": "CVE-2013-3587",
        "cwe": "CWE-310"
      }
    ],
    "checked_at": "2026-04-18T22:10:00Z",
    "scan_duration_ms": 53880,
    "notes": []
  }
}
```

#### Códigos de status HTTP

- `200` OK
- `202` Aceito
- `400` Pedido inválido
- `401` Não autorizado
- `402` Pagamento necessário
- `424` HTTP 424
- `429` Demasiados pedidos

GET /v1/ssl/deep-scan/status Créditos: 0

#### Parâmetros de consulta

| Parâmetro | Tipo | obrigatório |
| --- | --- | --- |
| scan_token | string | obrigatório |

#### Campos da resposta

| Campo | Tipo |
| --- | --- |
| `cache_age_s` | integer |
| `status` | string |
| `domain` | string |
| `host` | string |
| `port` | integer |
| `profile` | string |
| `scan_token` | string |
| `message` | string |
| `poll_after_ms` | integer |
| `cache` | object |
| `cache.hit` | boolean |
| `cache.fresh` | boolean |
| `cache.started_at` | string \| null |
| `cache.completed_at` | string \| null |
| `cache.expires_at` | string \| null |
| `cache.engine` | string \| null |
| `cache.profile` | string \| null |
| `result` | object |
| `result.domain` | string |
| `result.host` | string |
| `result.port` | integer |
| `result.engine` | object |
| `result.engine.name` | string |
| `result.engine.mode` | string |
| `result.engine.version` | string \| null |
| `result.engine.profile` | string |
| `result.target` | object |
| `result.target.ip` | string \| null |
| `result.target.service` | string \| null |
| `result.target.rdns` | string \| null |
| `result.summary` | object |
| `result.summary.severity_counts` | object |
| `result.summary.severity_counts.critical` | integer |
| `result.summary.severity_counts.high` | integer |
| `result.summary.severity_counts.medium` | integer |
| `result.summary.severity_counts.low` | integer |
| `result.summary.severity_counts.warn` | integer |
| `result.summary.severity_counts.info` | integer |
| `result.summary.severity_counts.ok` | integer |
| `result.summary.actionable_findings` | integer |
| `result.summary.protocols_offered[]` | string[] |
| `result.summary.deprecated_protocols[]` | string[] |
| `result.summary.supports_tls_1_3` | boolean \| null |
| `result.summary.supports_http2` | boolean \| null |
| `result.summary.supports_http3` | boolean \| null |
| `result.sections` | object |
| `result.sections.pretest[]` | object[] |
| `result.sections.pretest[]` | object |
| `result.sections.pretest[].id` | string |
| `result.sections.pretest[].severity` | string |
| `result.sections.pretest[].finding` | string |
| `result.sections.pretest[].cve` | string |
| `result.sections.pretest[].cwe` | string |
| `result.sections.protocols[]` | object[] |
| `result.sections.protocols[]` | object |
| `result.sections.protocols[].id` | string |
| `result.sections.protocols[].severity` | string |
| `result.sections.protocols[].finding` | string |
| `result.sections.protocols[].cve` | string |
| `result.sections.protocols[].cwe` | string |
| `result.sections.server_defaults[]` | object[] |
| `result.sections.server_defaults[]` | object |
| `result.sections.server_defaults[].id` | string |
| `result.sections.server_defaults[].severity` | string |
| `result.sections.server_defaults[].finding` | string |
| `result.sections.server_defaults[].cve` | string |
| `result.sections.server_defaults[].cwe` | string |
| `result.sections.server_preferences[]` | object[] |
| `result.sections.server_preferences[]` | object |
| `result.sections.server_preferences[].id` | string |
| `result.sections.server_preferences[].severity` | string |
| `result.sections.server_preferences[].finding` | string |
| `result.sections.server_preferences[].cve` | string |
| `result.sections.server_preferences[].cwe` | string |
| `result.sections.cipher_categories[]` | object[] |
| `result.sections.cipher_categories[]` | object |
| `result.sections.cipher_categories[].id` | string |
| `result.sections.cipher_categories[].severity` | string |
| `result.sections.cipher_categories[].finding` | string |
| `result.sections.cipher_categories[].cve` | string |
| `result.sections.cipher_categories[].cwe` | string |
| `result.sections.forward_secrecy[]` | object[] |
| `result.sections.forward_secrecy[]` | object |
| `result.sections.forward_secrecy[].id` | string |
| `result.sections.forward_secrecy[].severity` | string |
| `result.sections.forward_secrecy[].finding` | string |
| `result.sections.forward_secrecy[].cve` | string |
| `result.sections.forward_secrecy[].cwe` | string |
| `result.sections.vulnerabilities[]` | object[] |
| `result.sections.vulnerabilities[]` | object |
| `result.sections.vulnerabilities[].id` | string |
| `result.sections.vulnerabilities[].severity` | string |
| `result.sections.vulnerabilities[].finding` | string |
| `result.sections.vulnerabilities[].cve` | string |
| `result.sections.vulnerabilities[].cwe` | string |
| `result.sections.browser_simulations[]` | object[] |
| `result.sections.browser_simulations[]` | object |
| `result.sections.browser_simulations[].id` | string |
| `result.sections.browser_simulations[].severity` | string |
| `result.sections.browser_simulations[].finding` | string |
| `result.sections.browser_simulations[].cve` | string |
| `result.sections.browser_simulations[].cwe` | string |
| `result.sections.rating[]` | object[] |
| `result.sections.rating[]` | object |
| `result.sections.rating[].id` | string |
| `result.sections.rating[].severity` | string |
| `result.sections.rating[].finding` | string |
| `result.sections.rating[].cve` | string |
| `result.sections.rating[].cwe` | string |
| `result.findings[]` | object[] |
| `result.findings[]` | object |
| `result.findings[].section` | string |
| `result.findings[].id` | string |
| `result.findings[].severity` | string |
| `result.findings[].finding` | string |
| `result.findings[].cve` | string |
| `result.findings[].cwe` | string |
| `result.checked_at` | string |
| `result.scan_duration_ms` | integer |
| `result.notes[]` | string[] |
| `error` | object |
| `error.message` | string |
| `error.retryable` | boolean |

#### Exemplo de requisição

```bash
curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/ssl/deep-scan/status?scan_token=SIGNED_TOKEN_FROM_SSL_DEEP_SCAN"
```

```javascript
const response = await fetch("https://domscan.net/v1/ssl/deep-scan/status?scan_token=SIGNED_TOKEN_FROM_SSL_DEEP_SCAN", {
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);
```

```python
import os
import requests

response = requests.get(
    "https://domscan.net/v1/ssl/deep-scan/status?scan_token=SIGNED_TOKEN_FROM_SSL_DEEP_SCAN",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())
```

```go
package main

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/ssl/deep-scan/status?scan_token=SIGNED_TOKEN_FROM_SSL_DEEP_SCAN", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))

```ruby
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/ssl/deep-scan/status?scan_token=SIGNED_TOKEN_FROM_SSL_DEEP_SCAN")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")

#### Exemplo de resposta

```json
{
  "status": "ready",
  "domain": "openai.com",
  "host": "openai.com",
  "port": 443,
  "profile": "full",
  "scan_token": "eyJrIjoidGxzLWRlZXAtc2NhbiIsImkiOiJleGFtcGxlIiwiaCI6Im9wZW5haS5jb20ifQ",
  "cache": {
    "hit": true,
    "fresh": true,
    "completed_at": "2026-04-18T22:10:00Z",
    "expires_at": "2026-04-19T22:10:00Z",
    "engine": "testssl.sh",
    "profile": "full"
  },
  "result": {
    "domain": "openai.com",
    "host": "openai.com",
    "port": 443,
    "engine": {
      "name": "testssl.sh",
      "mode": "testssl",
      "version": "3.3dev",
      "profile": "full"
    },
    "target": {
      "ip": "172.64.154.211",
      "service": "HTTP",
      "rdns": "--"
    },
    "summary": {
      "severity_counts": {
        "critical": 0,
        "high": 1,
        "medium": 1,
        "low": 0,
        "warn": 1,
        "info": 6,
        "ok": 4
      },
      "actionable_findings": 3,
      "protocols_offered": [
        "TLS1_2",
        "TLS1_3"
      ],
      "deprecated_protocols": [],
      "supports_tls_1_3": true,
      "supports_http2": true,
      "supports_http3": null
    },
    "sections": {
      "pretest": [],
      "protocols": [
        {
          "id": "TLS1_2",
          "severity": "OK",
          "finding": "offered"
        },
        {
          "id": "TLS1_3",
          "severity": "OK",
          "finding": "offered with final"
        },
        {
          "id": "QUIC",
          "severity": "WARN",
          "finding": "not tested due to lack of local OpenSSL support"
        }
      ],
      "server_defaults": [
        {
          "id": "early_data",
          "severity": "HIGH",
          "finding": "supported"
        }
      ],
      "server_preferences": [],
      "cipher_categories": [],
      "forward_secrecy": [],
      "vulnerabilities": [
        {
          "id": "BREACH",
          "severity": "MEDIUM",
          "finding": "potentially VULNERABLE, br gzip HTTP compression detected",
          "cve": "CVE-2013-3587",
          "cwe": "CWE-310"
        }
      ],
      "browser_simulations": [],
      "rating": []
    },
    "findings": [
      {
        "section": "protocols",
        "id": "QUIC",
        "severity": "WARN",
        "finding": "not tested due to lack of local OpenSSL support"
      },
      {
        "section": "server_defaults",
        "id": "early_data",
        "severity": "HIGH",
        "finding": "supported"
      },
      {
        "section": "vulnerabilities",
        "id": "BREACH",
        "severity": "MEDIUM",
        "finding": "potentially VULNERABLE, br gzip HTTP compression detected",
        "cve": "CVE-2013-3587",
        "cwe": "CWE-310"
      }
    ],
    "checked_at": "2026-04-18T22:10:00Z",
    "scan_duration_ms": 53880,
    "notes": []
  }
}
```

#### Códigos de status HTTP

- `200` OK
- `202` Aceito
- `400` Pedido inválido
- `401` Não autorizado
- `404` Não encontrado
- `424` HTTP 424
- `429` Demasiados pedidos

GET /v1/ssl/grade Créditos: 3

#### Parâmetros de consulta

| Parâmetro | Tipo | obrigatório |
| --- | --- | --- |
| domain | string | obrigatório |

#### Campos da resposta

| Campo | Tipo |
| --- | --- |
| `domain` | string |
| `classification` | object |
| `classification.status` | string |
| `classification.reason` | string |
| `classification.evidence` | object |
| `classification.evidence.source` | string |
| `classification.evidence.method` | string |
| `classification.evidence.observed_at` | string |
| `classification.evidence.detail` | string |
| `classification.checked_at` | string |
| `grade` | string \| null |
| `score` | integer \| null |
| `grade_reason` | string \| null |
| `protocol_support` | object |
| `protocol_support.tls_1_3` | boolean |
| `protocol_support.tls_1_2` | boolean |
| `protocol_support.tls_1_1` | boolean |
| `protocol_support.tls_1_0` | boolean |
| `protocol_support.ssl_3` | boolean |
| `protocol_support.preferred_protocol` | string |
| `protocol_support.detection_method` | string |
| `certificate` | object |
| `certificate.subject` | string |
| `certificate.issuer` | string |
| `certificate.issuer_org` | string |
| `certificate.valid_from` | string |
| `certificate.valid_until` | string |
| `certificate.days_remaining` | integer |
| `certificate.expired` | boolean |
| `certificate.san[]` | string[] |
| `certificate.key_type` | string |
| `certificate.key_size` | integer |
| `certificate.signature_algorithm` | string |
| `certificate.fingerprint_sha256` | string |
| `certificate.serial_number` | string |
| `chain` | object |
| `chain.length` | integer |
| `chain.valid` | boolean |
| `chain.certificates[]` | object[] |
| `chain.certificates[]` | object |
| `chain.certificates[].subject` | string |
| `chain.certificates[].issuer` | string |
| `chain.certificates[].type` | string |
| `chain.certificates[].valid_from` | string |
| `chain.certificates[].valid_until` | string |
| `chain.issues[]` | string[] |
| `security` | object |
| `security.forward_secrecy` | boolean |
| `security.forward_secrecy_cipher` | string |
| `security.hsts_enabled` | boolean |
| `security.hsts_max_age` | integer |
| `security.hsts_include_subdomains` | boolean |
| `security.hsts_preload` | boolean |
| `security.hsts_header` | string |
| `security.hsts_preload_status` | string |
| `security.hsts_preloaded_domain` | string |
| `security.hsts_preload_eligible` | boolean |
| `security.hsts_final_url` | string |
| `security.hsts_errors[]` | string[] |
| `security.alpn_negotiated` | string |
| `security.ocsp_stapling` | boolean |
| `security.ocsp_stapling_fresh` | boolean |
| `security.ocsp_stapling_status` | string \| null |
| `security.ocsp_stapling_this_update` | string \| null |
| `security.ocsp_stapling_next_update` | string \| null |
| `security.sct_embedded` | boolean |
| `security.sct_count` | integer |
| `security.ct_compliance` | boolean |
| `security.must_staple` | boolean |
| `security.secure_renegotiation` | boolean |
| `revocation` | object |
| `revocation.ocsp` | object |
| `revocation.ocsp.present` | boolean |
| `revocation.ocsp.uris[]` | string[] |
| `revocation.ocsp.checked_uri` | string \| null |
| `revocation.ocsp.status` | string \| null |
| `revocation.ocsp.verify_ok` | boolean |
| `revocation.ocsp.this_update` | string \| null |
| `revocation.ocsp.next_update` | string \| null |
| `revocation.ocsp.error` | string \| null |
| `revocation.crl` | object |
| `revocation.crl.present` | boolean |
| `revocation.crl.uris[]` | string[] |
| `revocation.crl.checked_uri` | string \| null |
| `revocation.crl.fetched` | boolean |
| `revocation.crl.http_status` | integer \| null |
| `revocation.crl.revoked` | boolean \| null |
| `revocation.crl.last_update` | string \| null |
| `revocation.crl.next_update` | string \| null |
| `revocation.crl.revoked_serial_count` | integer \| null |
| `revocation.crl.error` | string \| null |
| `grade_delta` | object |
| `grade_delta.current_grade` | string \| null |
| `grade_delta.score` | integer \| null |
| `grade_delta.next_grade` | string \| null |
| `grade_delta.points_to_next_grade` | integer \| null |
| `grade_delta.top_blockers[]` | string[] |
| `issues[]` | string[] |
| `recommendations[]` | string[] |
| `checked_at` | string |
| `check_duration_ms` | integer |

#### Exemplo de requisição

```bash
curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/ssl/grade?domain=example.com"
```

```javascript
const response = await fetch("https://domscan.net/v1/ssl/grade?domain=example.com", {
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);
```

```python
import os
import requests

response = requests.get(
    "https://domscan.net/v1/ssl/grade?domain=example.com",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())
```

```go
package main

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/ssl/grade?domain=example.com", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))

```ruby
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/ssl/grade?domain=example.com")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")

#### Exemplo de resposta

```json
{
  "domain": "cloudflare.com",
  "grade": "A+",
  "score": 98,
  "protocol_support": {
    "tls_1_3": true,
    "tls_1_2": true,
    "tls_1_1": false,
    "tls_1_0": false,
    "ssl_3": false,
    "preferred_protocol": "TLSv1.3",
    "detection_method": "active"
  },
  "certificate": {
    "subject": "cloudflare.com",
    "issuer": "Google Trust Services",
    "valid_from": "2026-03-01T00:00:00Z",
    "valid_until": "2026-05-30T23:59:59Z",
    "days_remaining": 42,
    "expired": false,
    "san": [
      "cloudflare.com",
      "*.cloudflare.com"
    ],
    "key_type": "ECDSA",
    "key_size": 256,
    "signature_algorithm": "ecdsaWithSHA256",
    "fingerprint_sha256": "AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99"
  },
  "chain": {
    "length": 3,
    "valid": true,
    "certificates": [
      {
        "subject": "cloudflare.com",
        "issuer": "Google Trust Services",
        "type": "leaf"
      },
      {
        "subject": "Google Trust Services",
        "issuer": "GlobalSign",
        "type": "intermediate"
      },
      {
        "subject": "GlobalSign",
        "issuer": "GlobalSign",
        "type": "root"
      }
    ],
    "issues": []
  },
  "security": {
    "forward_secrecy": true,
    "forward_secrecy_cipher": "TLS_AES_256_GCM_SHA384",
    "hsts_enabled": true,
    "hsts_max_age": 31536000,
    "hsts_include_subdomains": true,
    "hsts_preload": true,
    "hsts_header": "max-age=31536000; includeSubDomains; preload",
    "hsts_preload_status": "preloaded",
    "hsts_preloaded_domain": "cloudflare.com",
    "hsts_preload_eligible": true,
    "hsts_final_url": "https://cloudflare.com/",
    "hsts_errors": [],
    "alpn_negotiated": "h2",
    "ocsp_stapling": true,
    "ocsp_stapling_fresh": true,
    "ocsp_stapling_status": "successful (0x0)",
    "ocsp_stapling_this_update": "2026-04-15T02:35:16Z",
    "ocsp_stapling_next_update": "2026-04-22T01:35:15Z",
    "ct_compliance": true,
    "must_staple": false,
    "sct_embedded": true,
    "sct_count": 2
  },
  "revocation": {
    "ocsp": {
      "present": true,
      "uris": [
        "http://o.pki.goog/wr2"
      ],
      "checked_uri": "http://o.pki.goog/wr2",
      "status": "good",
      "verify_ok": true,
      "this_update": "2026-04-18T20:30:00Z",
      "next_update": "2026-04-19T20:30:00Z",
      "error": null
    },
    "crl": {
      "present": true,
      "uris": [
        "http://c.pki.goog/wr2.crl"
      ],
      "checked_uri": "http://c.pki.goog/wr2.crl",
      "fetched": true,
      "http_status": 200,
      "revoked": false,
      "last_update": "2026-04-17T00:00:00Z",
      "next_update": "2026-04-24T00:00:00Z",
      "revoked_serial_count": 0,
      "error": null
    }
  },
  "grade_delta": {
    "current_grade": "A+",
    "score": 98,
    "next_grade": null,
    "points_to_next_grade": null,
    "top_blockers": []
  },
  "issues": [],
  "recommendations": [],
  "checked_at": "2026-04-18T21:00:00Z",
  "check_duration_ms": 142
}
```

#### Códigos de status HTTP

- `200` OK
- `400` Pedido inválido
- `401` Não autorizado
- `402` Pagamento necessário
- `429` Demasiados pedidos

GET /v1/ssl/chain Créditos: 3

#### Parâmetros de consulta

| Parâmetro | Tipo | obrigatório |
| --- | --- | --- |
| domain | string | obrigatório |

#### Campos da resposta

| Campo | Tipo |
| --- | --- |
| `domain` | string |
| `classification` | object |
| `classification.status` | string |
| `classification.reason` | string |
| `classification.evidence` | object |
| `classification.evidence.source` | string |
| `classification.evidence.method` | string |
| `classification.evidence.observed_at` | string |
| `classification.evidence.detail` | string |
| `classification.checked_at` | string |
| `chain[]` | object[] |
| `chain[]` | object |
| `chain[].subject` | string |
| `chain[].issuer` | string |
| `chain[].type` | string |
| `chain[].valid_from` | string \| null |
| `chain[].valid_until` | string \| null |
| `chain_length` | integer |
| `root_trusted` | boolean |
| `chain_valid` | boolean |
| `certificate` | object |
| `certificate.subject` | string |
| `certificate.issuer` | string |
| `certificate.issuer_org` | string |
| `certificate.valid_from` | string |
| `certificate.valid_until` | string |
| `certificate.days_remaining` | integer |
| `certificate.expired` | boolean |
| `certificate.san[]` | string[] |
| `certificate.key_type` | string |
| `certificate.key_size` | integer |
| `certificate.signature_algorithm` | string |
| `certificate.fingerprint_sha256` | string |
| `certificate.serial_number` | string |
| `protocol_support` | object |
| `protocol_support.tls_1_3` | boolean |
| `protocol_support.tls_1_2` | boolean |
| `protocol_support.tls_1_1` | boolean |
| `protocol_support.tls_1_0` | boolean |
| `protocol_support.ssl_3` | boolean |
| `protocol_support.preferred_protocol` | string |
| `protocol_support.detection_method` | string |
| `security` | object |
| `security.alpn_negotiated` | string |
| `security.forward_secrecy` | boolean |
| `security.forward_secrecy_cipher` | string |
| `security.must_staple` | boolean |
| `security.sct_embedded` | boolean |
| `security.sct_count` | integer |
| `security.ocsp_stapling` | boolean |
| `security.ocsp_stapling_fresh` | boolean |
| `security.ocsp_stapling_status` | string \| null |
| `security.ocsp_stapling_this_update` | string \| null |
| `security.ocsp_stapling_next_update` | string \| null |
| `issues[]` | string[] |
| `remediation_hints[]` | string[] |
| `revocation` | object |
| `revocation.ocsp` | object |
| `revocation.ocsp.present` | boolean |
| `revocation.ocsp.uris[]` | string[] |
| `revocation.ocsp.checked_uri` | string \| null |
| `revocation.ocsp.status` | string \| null |
| `revocation.ocsp.verify_ok` | boolean |
| `revocation.ocsp.this_update` | string \| null |
| `revocation.ocsp.next_update` | string \| null |
| `revocation.ocsp.error` | string \| null |
| `revocation.crl` | object |
| `revocation.crl.present` | boolean |
| `revocation.crl.uris[]` | string[] |
| `revocation.crl.checked_uri` | string \| null |
| `revocation.crl.fetched` | boolean |
| `revocation.crl.http_status` | integer \| null |
| `revocation.crl.revoked` | boolean \| null |
| `revocation.crl.last_update` | string \| null |
| `revocation.crl.next_update` | string \| null |
| `revocation.crl.revoked_serial_count` | integer \| null |
| `revocation.crl.error` | string \| null |
| `checked_at` | string |

#### Exemplo de requisição

```bash
curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/ssl/chain?domain=example.com"
```

```javascript
const response = await fetch("https://domscan.net/v1/ssl/chain?domain=example.com", {
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);
```

```python
import os
import requests

response = requests.get(
    "https://domscan.net/v1/ssl/chain?domain=example.com",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())
```

```go
package main

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/ssl/chain?domain=example.com", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))

```ruby
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/ssl/chain?domain=example.com")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")

#### Exemplo de resposta

```json
{
  "domain": "cloudflare.com",
  "chain": [
    {
      "subject": "cloudflare.com",
      "issuer": "Google Trust Services",
      "type": "leaf",
      "valid_from": "2026-03-01T00:00:00Z",
      "valid_until": "2026-05-30T23:59:59Z"
    },
    {
      "subject": "Google Trust Services",
      "issuer": "GlobalSign",
      "type": "intermediate",
      "valid_from": "2024-01-01T00:00:00Z",
      "valid_until": "2029-01-01T00:00:00Z"
    }
  ],
  "chain_valid": true,
  "chain_length": 2,
  "root_trusted": true,
  "certificate": {
    "subject": "cloudflare.com",
    "issuer": "Google Trust Services",
    "valid_from": "2026-03-01T00:00:00Z",
    "valid_until": "2026-05-30T23:59:59Z",
    "days_remaining": 42,
    "expired": false,
    "san": [
      "cloudflare.com",
      "*.cloudflare.com"
    ],
    "key_type": "ECDSA",
    "key_size": 256,
    "signature_algorithm": "ecdsaWithSHA256",
    "fingerprint_sha256": "AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99"
  },
  "protocol_support": {
    "tls_1_3": true,
    "tls_1_2": true,
    "tls_1_1": false,
    "tls_1_0": false,
    "ssl_3": false,
    "preferred_protocol": "TLSv1.3",
    "detection_method": "active"
  },
  "security": {
    "alpn_negotiated": "h2",
    "forward_secrecy": true,
    "forward_secrecy_cipher": "TLS_AES_256_GCM_SHA384",
    "must_staple": false,
    "sct_embedded": true,
    "sct_count": 2,
    "ocsp_stapling": true,
    "ocsp_stapling_fresh": true,
    "ocsp_stapling_status": "successful (0x0)",
    "ocsp_stapling_this_update": "2026-04-15T02:35:16Z",
    "ocsp_stapling_next_update": "2026-04-22T01:35:15Z"
  },
  "issues": [],
  "remediation_hints": [],
  "revocation": {
    "ocsp": {
      "present": true,
      "uris": [
        "http://o.pki.goog/wr2"
      ],
      "checked_uri": "http://o.pki.goog/wr2",
      "status": "good",
      "verify_ok": true,
      "this_update": "2026-04-18T20:30:00Z",
      "next_update": "2026-04-19T20:30:00Z",
      "error": null
    },
    "crl": {
      "present": true,
      "uris": [
        "http://c.pki.goog/wr2.crl"
      ],
      "checked_uri": "http://c.pki.goog/wr2.crl",
      "fetched": true,
      "http_status": 200,
      "revoked": false,
      "last_update": "2026-04-17T00:00:00Z",
      "next_update": "2026-04-24T00:00:00Z",
      "revoked_serial_count": 0,
      "error": null
    }
  },
  "checked_at": "2026-04-18T21:00:00Z"
}
```

#### Códigos de status HTTP

- `200` OK
- `400` Pedido inválido
- `401` Não autorizado
- `402` Pagamento necessário
- `429` Demasiados pedidos

GET /v1/ssl/expiring Créditos: 1

#### Parâmetros de consulta

| Parâmetro | Tipo | obrigatório |
| --- | --- | --- |
| domain | string | obrigatório |
| days | integer Padrão `30` | opcional |
| threshold_days | integer | opcional |

#### Campos da resposta

| Campo | Tipo |
| --- | --- |
| `domain` | string |
| `classification` | object |
| `classification.status` | string |
| `classification.reason` | string |
| `classification.evidence` | object |
| `classification.evidence.source` | string |
| `classification.evidence.method` | string |
| `classification.evidence.observed_at` | string |
| `classification.evidence.detail` | string |
| `classification.checked_at` | string |
| `certificate_status` | string |
| `expiring_soon` | boolean |
| `expired` | boolean |
| `days_remaining` | integer |
| `valid_from` | string |
| `valid_until` | string |
| `subject` | string |
| `issuer` | string |
| `urgency` | string |
| `recommendation` | string |
| `checked_at` | string |

#### Exemplo de requisição

```bash
curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/ssl/expiring?domain=example.com&days=30&threshold_days=1"
```

```javascript
const response = await fetch("https://domscan.net/v1/ssl/expiring?domain=example.com&days=30&threshold_days=1", {
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);
```

```python
import os
import requests

response = requests.get(
    "https://domscan.net/v1/ssl/expiring?domain=example.com&days=30&threshold_days=1",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())
```

```go
package main

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/ssl/expiring?domain=example.com&days=30&threshold_days=1", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))

```ruby
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/ssl/expiring?domain=example.com&days=30&threshold_days=1")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")

#### Exemplo de resposta

```json
{
  "domain": "example.com",
  "certificate_status": "found",
  "expiring_soon": true,
  "expired": false,
  "days_remaining": 25,
  "valid_from": "2026-08-05T08:12:44Z",
  "valid_until": "2026-11-03T08:12:43Z",
  "subject": "/CN=www.example.com",
  "issuer": "/C=US/O=Let's Encrypt/CN=R11",
  "urgency": "notice",
  "recommendation": "Certificate expires in 25 days - plan renewal",
  "checked_at": "2026-10-09T10:15:30.000Z"
}
```

#### Códigos de status HTTP

- `200` OK
- `400` Pedido inválido
- `401` Não autorizado
- `402` Pagamento necessário
- `429` Demasiados pedidos

POST /v1/certificates/bulk Créditos: 2/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 |
| include_subdomains | boolean Padrão `true` | opcional |
| include_expired | boolean Padrão `false` | opcional |
| limit | integer Padrão `100` | 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

```bash
curl -X POST "https://domscan.net/v1/certificates/bulk" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $DOMSCAN_API_KEY" \
  -d '{
  "domains": [
    "example.com",
    "cloudflare.com"
  ],
  "include_subdomains": true,
  "limit": 100
}'
```

```javascript
const response = await fetch("https://domscan.net/v1/certificates/bulk", {
  method: "POST",
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY, "Content-Type": "application/json" },
  body: JSON.stringify({
    "domains": [
      "example.com",
      "cloudflare.com"
    ],
    "include_subdomains": true,
    "limit": 100
  }),
});
const data = await response.json();
console.log(data);
```

```python
import os
import requests

response = requests.post(
    "https://domscan.net/v1/certificates/bulk",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
    json={
        "domains": [
            "example.com",
            "cloudflare.com",
        ],
        "include_subdomains": True,
        "limit": 100,
    },
)
print(response.json())
```

```go
package main

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

func main() {
	body := strings.NewReader(`{
	  "domains": [
	    "example.com",
	    "cloudflare.com"
	  ],
	  "include_subdomains": true,
	  "limit": 100
	}`)
	req, err := http.NewRequest(http.MethodPost, "https://domscan.net/v1/certificates/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")

```ruby
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/certificates/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"
  ],
  "include_subdomains" => true,
  "limit" => 100
})

#### Exemplo de resposta

```json
{
  "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

GET /v1/headers Créditos: 1

#### Parâmetros de consulta

| Parâmetro | Tipo | obrigatório |
| --- | --- | --- |
| url | string | opcional |
| domain | string | opcional |

#### Campos da resposta

| Campo | Tipo |
| --- | --- |
| `classification` | object |
| `classification.status` | string |
| `classification.reason` | string |
| `classification.evidence` | object |
| `classification.evidence.source` | string |
| `classification.evidence.method` | string |
| `classification.evidence.observed_at` | string |
| `classification.evidence.detail` | string |
| `classification.checked_at` | string |
| `url` | string |
| `domain` | string |
| `status` | string |
| `checked_at` | string |
| `final_url` | string \| null |
| `http_status` | integer \| null |
| `redirect_count` | integer \| null |
| `https` | boolean \| null |
| `score` | integer \| null |
| `grade` | string \| null |
| `summary` | object |
| `summary.passed` | integer |
| `summary.warned` | integer |
| `summary.failed` | integer |
| `summary.missing` | integer |
| `summary.not_applicable` | integer |
| `summary.hsts_preload_ready` | boolean |
| `summary.csp_strict` | boolean |
| `checks[]` | object[] |
| `checks[]` | object |
| `checks[].id` | string |
| `checks[].status` | string |
| `checks[].value` | string \| null |
| `checks[].detail_code` | string |
| `checks[].issues[]` | string[] |
| `checks[].weight` | integer |
| `checks[].classification` | object |
| `checks[].classification.status` | string |
| `checks[].classification.reason` | string |
| `checks[].classification.evidence` | object |
| `checks[].classification.evidence.source` | string |
| `checks[].classification.evidence.method` | string |
| `checks[].classification.evidence.observed_at` | string |
| `checks[].classification.evidence.detail` | string |
| `checks[].classification.checked_at` | string |
| `cookies[]` | object[] |
| `cookies[]` | object |
| `cookies[].name` | string |
| `cookies[].secure` | boolean |
| `cookies[].http_only` | boolean |
| `cookies[].same_site` | string \| null |
| `cookies[].issues[]` | string[] |
| `headers_raw` | object |
| `recommendations[]` | string[] |
| `fetch` | object |
| `fetch.checked_url` | string |
| `fetch.http_status` | integer \| null |
| `fetch.final_url` | string \| null |
| `fetch.via_proxy` | boolean \| null |
| `fetch.redirect_count` | integer \| null |
| `fetch.unknown_reason` | string \| null |
| `caveats[]` | string[] |
| `rubric_version` | string |

#### Exemplo de requisição

```bash
curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/headers?url=https%3A%2F%2Fexample.com&domain=example.com"
```

```javascript
const response = await fetch("https://domscan.net/v1/headers?url=https%3A%2F%2Fexample.com&domain=example.com", {
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);
```

```python
import os
import requests

response = requests.get(
    "https://domscan.net/v1/headers?url=https%3A%2F%2Fexample.com&domain=example.com",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())
```

```go
package main

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/headers?url=https%3A%2F%2Fexample.com&domain=example.com", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))

```ruby
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/headers?url=https%3A%2F%2Fexample.com&domain=example.com")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")

#### Exemplo de resposta

```json
{
  "url": "https://example.com/",
  "domain": "example.com",
  "status": "ok",
  "checked_at": "2026-10-09T10:15:30.000Z",
  "final_url": "https://www.example.com/",
  "http_status": 200,
  "redirect_count": 1,
  "https": true,
  "score": 75,
  "grade": "C",
  "summary": {
    "passed": 6,
    "warned": 2,
    "failed": 0,
    "missing": 2,
    "not_applicable": 1,
    "hsts_preload_ready": false,
    "csp_strict": false
  },
  "checks": [
    {
      "id": "strict_transport_security",
      "status": "pass",
      "value": "max-age=31536000",
      "detail_code": "enabled",
      "issues": [
        "include_subdomains_missing",
        "preload_missing"
      ],
      "weight": 20
    },
    {
      "id": "content_security_policy",
      "status": "warn",
      "value": "default-src 'self'; script-src 'self' 'unsafe-inline'",
      "detail_code": "unsafe_inline",
      "issues": [
        "missing_object_src",
        "missing_base_uri",
        "unsafe_inline"
      ],
      "weight": 25
    },
    {
      "id": "clickjacking",
      "status": "pass",
      "value": "SAMEORIGIN",
      "detail_code": "x_frame_options_sameorigin",
      "issues": [],
      "weight": 10
    },
    {
      "id": "x_content_type_options",
      "status": "pass",
      "value": "nosniff",
      "detail_code": "nosniff",
      "issues": [],
      "weight": 10
    },
    {
      "id": "referrer_policy",
      "status": "pass",
      "value": "strict-origin-when-cross-origin",
      "detail_code": "strict_origin_when_cross_origin",
      "issues": [],
      "weight": 10
    },
    {
      "id": "permissions_policy",
      "status": "missing",
      "value": null,
      "detail_code": "header_missing",
      "issues": [],
      "weight": 5
    },
    {
      "id": "cross_origin_opener_policy",
      "status": "pass",
      "value": "same-origin",
      "detail_code": "same_origin",
      "issues": [],
      "weight": 5
    },
    {
      "id": "cross_origin_embedder_policy",
      "status": "not_applicable",
      "value": null,
      "detail_code": "not_set_informational",
      "issues": [],
      "weight": 0
    },
    {
      "id": "cross_origin_resource_policy",
      "status": "missing",
      "value": null,
      "detail_code": "header_missing",
      "issues": [],
      "weight": 5
    },
    {
      "id": "information_disclosure",
      "status": "warn",
      "value": "server: nginx/1.25.3",
      "detail_code": "version_disclosed",
      "issues": [
        "server_version_disclosed"
      ],
      "weight": 5
    },
    {
      "id": "cookies",
      "status": "pass",
      "value": "session",
      "detail_code": "all_flags_set",
      "issues": [],
      "weight": 5
    }
  ],
  "cookies": [
    {
      "name": "session",
      "secure": true,
      "http_only": true,
      "same_site": "lax",
      "issues": []
    }
  ],
  "headers_raw": {
    "strict-transport-security": "max-age=31536000",
    "content-security-policy": "default-src 'self'; script-src 'self' 'unsafe-inline'",
    "x-frame-options": "SAMEORIGIN",
    "x-content-type-options": "nosniff",
    "referrer-policy": "strict-origin-when-cross-origin",
    "cross-origin-opener-policy": "same-origin",
    "server": "nginx/1.25.3"
  },
  "recommendations": [
    "remove_csp_unsafe_inline",
    "add_csp_object_src_none",
    "add_csp_base_uri",
    "add_hsts_include_subdomains",
    "add_hsts_preload",
    "add_permissions_policy",
    "add_cross_origin_resource_policy",
    "hide_server_version"
  ],
  "fetch": {
    "checked_url": "https://example.com/",
    "http_status": 200,
    "final_url": "https://www.example.com/",
    "via_proxy": true,
    "redirect_count": 1,
    "unknown_reason": null
  },
  "caveats": [
    "set_cookie_visibility_limited",
    "meta_csp_not_evaluated"
  ],
  "rubric_version": "2026-10-09.1"
}
```

#### Códigos de status HTTP

- `200` OK
- `400` Pedido inválido
- `401` Não autorizado
- `402` Pagamento necessário
- `429` Demasiados pedidos
- `502` Erro de gateway

GET /v1/security-txt Créditos: 1

#### Parâmetros de consulta

| Parâmetro | Tipo | obrigatório |
| --- | --- | --- |
| domain | string | opcional |
| url | string | opcional |

#### Campos da resposta

| Campo | Tipo |
| --- | --- |
| `classification` | object |
| `classification.status` | string |
| `classification.reason` | string |
| `classification.evidence` | object |
| `classification.evidence.source` | string |
| `classification.evidence.method` | string |
| `classification.evidence.observed_at` | string |
| `classification.evidence.detail` | string |
| `classification.checked_at` | string |
| `domain` | string |
| `status` | string |
| `location` | string \| null |
| `checked_at` | string |
| `fetch[]` | object[] |
| `fetch[]` | object |
| `fetch[].location` | string |
| `fetch[].checked_url` | string |
| `fetch[].http_status` | integer \| null |
| `fetch[].final_url` | string \| null |
| `fetch[].via_proxy` | boolean \| null |
| `fetch[].content_type` | string \| null |
| `fetch[].bytes` | integer \| null |
| `fetch[].truncated` | boolean |
| `fetch[].outcome` | string |
| `fetch[].error` | string \| null |
| `fields` | object |
| `fields.contact[]` | string[] |
| `fields.expires` | string \| null |
| `fields.expires_in_days` | integer \| null |
| `fields.encryption[]` | string[] |
| `fields.acknowledgments[]` | string[] |
| `fields.preferred_languages[]` | string[] |
| `fields.canonical[]` | string[] |
| `fields.policy[]` | string[] |
| `fields.hiring[]` | string[] |
| `fields.csaf[]` | string[] |
| `fields.other_fields[]` | object[] |
| `fields.other_fields[]` | object |
| `fields.other_fields[].name` | string |
| `fields.other_fields[].value` | string |
| `signed` | boolean |
| `issues[]` | object[] |
| `issues[]` | object |
| `issues[].code` | string |
| `issues[].severity` | string |
| `issues[].field` | string \| null |
| `caveats[]` | string[] |

#### Exemplo de requisição

```bash
curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/security-txt?domain=example.com&url=https%3A%2F%2Fexample.com"
```

```javascript
const response = await fetch("https://domscan.net/v1/security-txt?domain=example.com&url=https%3A%2F%2Fexample.com", {
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);
```

```python
import os
import requests

response = requests.get(
    "https://domscan.net/v1/security-txt?domain=example.com&url=https%3A%2F%2Fexample.com",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())
```

```go
package main

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/security-txt?domain=example.com&url=https%3A%2F%2Fexample.com", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))

```ruby
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/security-txt?domain=example.com&url=https%3A%2F%2Fexample.com")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")

#### Exemplo de resposta

```json
{
  "domain": "example.com",
  "status": "valid",
  "location": "well_known",
  "checked_at": "2026-10-09T10:00:00.000Z",
  "fetch": [
    {
      "location": "well_known",
      "checked_url": "https://example.com/.well-known/security.txt",
      "http_status": 200,
      "final_url": "https://example.com/.well-known/security.txt",
      "via_proxy": true,
      "content_type": "text/plain; charset=utf-8",
      "bytes": 279,
      "truncated": false,
      "outcome": "found",
      "error": null
    }
  ],
  "fields": {
    "contact": [
      "mailto:security@example.com",
      "https://example.com/report"
    ],
    "expires": "2027-01-01T00:00:00.000Z",
    "expires_in_days": 83,
    "encryption": [
      "https://example.com/pgp-key.txt"
    ],
    "acknowledgments": [],
    "preferred_languages": [
      "en",
      "es"
    ],
    "canonical": [
      "https://example.com/.well-known/security.txt"
    ],
    "policy": [
      "https://example.com/security-policy"
    ],
    "hiring": [],
    "csaf": [],
    "other_fields": []
  },
  "signed": false,
  "issues": [],
  "caveats": []
}
```

#### Códigos de status HTTP

- `200` OK
- `400` Pedido inválido
- `401` Não autorizado
- `402` Pagamento necessário
- `429` Demasiados pedidos
- `502` Erro de gateway

GET /v1/security-rating Créditos: 5

#### Parâmetros de consulta

| Parâmetro | Tipo | obrigatório |
| --- | --- | --- |
| domain | string | obrigatório |

#### Campos da resposta

| Campo | Tipo |
| --- | --- |
| `domain` | string |
| `status` | string |
| `score` | integer \| null |
| `grade` | string \| null |
| `checks_unknown` | integer |
| `score_confidence` | string |
| `weight_covered` | integer |
| `capped_by_critical_finding` | boolean |
| `categories[]` | object[] |
| `categories[]` | object |
| `categories[].id` | string |
| `categories[].status` | string |
| `categories[].score` | integer \| null |
| `categories[].weight` | integer |
| `categories[].unknown_reason` | string \| null |
| `categories[].findings[]` | object[] |
| `categories[].findings[]` | object |
| `categories[].findings[].code` | string |
| `categories[].findings[].severity` | string |
| `findings[]` | object[] |
| `findings[]` | object |
| `findings[].category` | string |
| `findings[].code` | string |
| `findings[].severity` | string |
| `sources` | object |
| `sources.tls` | object |
| `sources.tls.grade` | string \| null |
| `sources.tls.score` | integer \| null |
| `sources.tls.checked_at` | string |
| `sources.http_headers` | object |
| `sources.http_headers.status` | string |
| `sources.http_headers.grade` | string \| null |
| `sources.http_headers.score` | integer \| null |
| `sources.http_headers.final_url` | string \| null |
| `sources.http_headers.http_status` | integer \| null |
| `sources.dns_security` | object |
| `sources.dns_security.score` | integer \| null |
| `sources.dns_security.grade` | string \| null |
| `sources.dns_security.checks_unknown` | integer |
| `sources.dns_security.blocklists_checked` | integer |
| `sources.dns_security.blocklists_unknown` | integer |
| `sources.security_txt` | object |
| `sources.security_txt.status` | string |
| `sources.security_txt.location` | string \| null |
| `checked_at` | string |
| `duration_ms` | integer |
| `rating_version` | string |
| `caveats[]` | string[] |

#### Exemplo de requisição

```bash
curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/security-rating?domain=example.com"
```

```javascript
const response = await fetch("https://domscan.net/v1/security-rating?domain=example.com", {
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);
```

```python
import os
import requests

response = requests.get(
    "https://domscan.net/v1/security-rating?domain=example.com",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())
```

```go
package main

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

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/security-rating?domain=example.com", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))

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

```ruby
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/security-rating?domain=example.com")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")

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

```json
{
  "domain": "github.com",
  "status": "partial",
  "score": 81,
  "grade": "B",
  "checks_unknown": 1,
  "score_confidence": "medium",
  "weight_covered": 85,
  "capped_by_critical_finding": false,
  "categories": [
    {
      "id": "tls",
      "status": "scored",
      "score": 85,
      "weight": 30,
      "unknown_reason": null,
      "findings": []
    },
    {
      "id": "http_headers",
      "status": "scored",
      "score": 85,
      "weight": 20,
      "unknown_reason": null,
      "findings": [
        {
          "code": "header_permissions_policy_missing",
          "severity": "info"
        },
        {
          "code": "header_cross_origin_opener_policy_missing",
          "severity": "info"
        },
        {
          "code": "header_cross_origin_resource_policy_missing",
          "severity": "info"
        }
      ]
    },
    {
      "id": "email_authentication",
      "status": "scored",
      "score": 85,
      "weight": 20,
      "unknown_reason": null,
      "findings": []
    },
    {
      "id": "dns",
      "status": "scored",
      "score": 40,
      "weight": 10,
      "unknown_reason": null,
      "findings": [
        {
          "code": "dnssec_not_enabled",
          "severity": "low"
        }
      ]
    },
    {
      "id": "reputation",
      "status": "unknown",
      "score": null,
      "weight": 15,
      "unknown_reason": "no_evidence",
      "findings": []
    },
    {
      "id": "disclosure",
      "status": "scored",
      "score": 100,
      "weight": 5,
      "unknown_reason": null,
      "findings": []
    }
  ],
  "findings": [
    {
      "category": "dns",
      "code": "dnssec_not_enabled",
      "severity": "low"
    },
    {
      "category": "http_headers",
      "code": "header_permissions_policy_missing",
      "severity": "info"
    },
    {
      "category": "http_headers",
      "code": "header_cross_origin_opener_policy_missing",
      "severity": "info"
    },
    {
      "category": "http_headers",
      "code": "header_cross_origin_resource_policy_missing",
      "severity": "info"
    }
  ],
  "sources": {
    "tls": {
      "grade": "A",
      "score": 85,
      "checked_at": "2026-10-18T04:14:57.278Z"
    },
    "http_headers": {
      "status": "ok",
      "grade": "B",
      "score": 85,
      "final_url": "https://github.com/",
      "http_status": 200
    },
    "dns_security": {
      "score": 70,
      "grade": "B",
      "checks_unknown": 0,
      "blocklists_checked": 3,
      "blocklists_unknown": 1
    },
    "security_txt": {
      "status": "valid",
      "location": "well_known"
    }
  },
  "checked_at": "2026-10-18T04:14:58.507Z",
  "duration_ms": 2114,
  "rating_version": "2026-10-18.1",
  "caveats": [
    "passive_checks_only",
    "not_a_penetration_test",
    "tls_protocols_inferred",
    "unknown_categories_excluded_from_score"
  ]
}
```

#### Códigos de status HTTP

- `200` OK
- `400` Pedido inválido
- `401` Não autorizado
- `402` Pagamento necessário
- `429` Demasiados pedidos
