← Atrás
SwarmHawk 0.10 · API REST

API de SwarmHawk

La API de SwarmHawk te da acceso programático a 27 controles de seguridad automatizados más de 3.000+ plantillas CVE activas de nuclei — SSL, DNS, CVEs con confirmación de exploit activo, exposición de breach, typosquats, análisis de amenazas con IA y más — para cualquier dominio. Úsalo para construir flujos de trabajo de seguridad, automatizar due diligence o integrar SwarmHawk en tu propia plataforma.

Hay dos superficies de API:

  • /api/v2 — la superficie autenticada por sesión/JWT heredada utilizada por el panel. La mayoría de lecturas y escrituras también están disponibles aquí por compatibilidad.
  • /api/v1 — la moderna API pública de Business / Enterprise, asegurada con claves API de portador (swh_…). Esta es la que deben usar las nuevas integraciones.
URL Base https://api.swarmhawk.com
📘 Todas las respuestas son JSON. Todas las solicitudes con cuerpo deben establecer Content-Type: application/json.

Inicio Rápido — escanea un dominio en 30 segundos

# 1. Create an API key at www.swarmhawk.com → Account → API Keys (Business or Enterprise)
# 2. Add and start scanning a domain:

curl -X POST https://api.swarmhawk.com/api/v1/domains \
  -H "Authorization: Bearer swh_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"domain": "example.com"}'

# Poll the latest report:
curl https://api.swarmhawk.com/api/v1/jobs/<job_id> \
  -H "Authorization: Bearer swh_your_key_here"
import requests

API_KEY = "swh_your_key_here"
BASE = "https://api.swarmhawk.com/api/v1"
H = {"Authorization": f"Bearer {API_KEY}"}

resp = requests.post(f"{BASE}/domains", headers=H, json={"domain": "example.com"})
job_id = resp.json()["job_id"]

job = requests.get(f"{BASE}/jobs/{job_id}", headers=H).json()
print(f"State: {job['state']}")
const BASE = "https://api.swarmhawk.com/api/v1";
const H = { "Authorization": "Bearer swh_your_key_here", "Content-Type": "application/json" };

const add = await fetch(`${BASE}/domains`, {
  method: "POST",
  headers: H,
  body: JSON.stringify({ domain: "example.com" })
}).then(r => r.json());

const job = await fetch(`${BASE}/jobs/${add.job_id}`, { headers: H }).then(r => r.json());
console.log(`State: ${job.state}`);

Autenticación

SwarmHawk utiliza dos métodos de autenticación según el endpoint:

MétodoEncabezadoUtilizado para
Clave API (Bearer)Authorization: Bearer swh_…/api/v1/* API pública de Business / Enterprise
JWT de SesiónAuthorization: Bearer <jwt>/api/v2/* y endpoints de panel (autenticados por usuario)
Ninguno—/public-scan, /health
🔑 Obtén tu clave API en www.swarmhawk.com → Iniciar Sesión → Cuenta → Claves API. Las claves API están disponibles en los planes Business y Enterprise.

Formato de clave API

swh_3f8a2b1c4d5e6f7a8b9c0d1e2f3a4b5c

Errores y Límites de Velocidad

Códigos de estado HTTP

CódigoSignificado
200Éxito
400Solicitud incorrecta — verifique el cuerpo de su solicitud
401Clave API o token de sesión faltante o inválido
403Prohibido — esta función requiere un plan de pago
429Límite de velocidad excedido
500Error del servidor — reintentar después de 30 segundos

Estructura de respuesta de error

{
  "detail": "Invalid API key"
}

Límites de velocidad

PlanLímite
FreeClaves API no disponibles; use el panel de control o /public-scan
BusinessCuota predeterminada por cuenta con recarga de cartera para créditos puntuales
EnterpriseLímites personalizados negociados según contrato
/public-scanSin clave requerida · limitado por IP

Escanear un dominio

No existe un único endpoint de "escaneo único". Para escanear un dominio a través de la API:

  1. Añade (y verifica) el dominio con POST /api/v1/domains — el primer escaneo se pone en cola automáticamente.
  2. Para volver a escanear un dominio ya agregado, llama a POST /api/v1/domains/{domain_id}/scan.
  3. Consulte GET /api/v1/jobs/{job_id} para el estado y GET /api/v2/domains/{domain_id}/report para los últimos resultados.
  4. Para escaneos anónimos puntuales sin cuenta, utiliza POST /public-scan (limitado por velocidad, resultados no almacenados).
Consulte las secciones Agregar dominio, Iniciar escaneo y Estado del trabajo en la API de Business / Enterprise para las formas de solicitud canónicas.

POST /public-scan

Escaneo anónimo — no requiere clave API. Devuelve un subconjunto de verificaciones con algunos resultados bloqueados. Úsalo para demostraciones o integraciones. Los resultados no se guardan.

POST /public-scan No auth
CampoTipoDescripción
domainstringDominio a escanear
{
  "domain": "example.com",
  "risk_score": 42,
  "critical": 1,
  "warnings": 3,
  "locked_count": 8,
  "checks": [/* 7 free checks visible, 8 locked */],
  "scanned_at": "2025-03-10T09:15:00Z"
}

GET /scan/passive

Escaneo de huella digital rápido — detecta la pila de software y verifica CVEs conocidos sin un escaneo completo. Respuesta en ~3 segundos. Sin resultados guardados.

GET /scan/passive?domain=example.com Bearer
{
  "domain": "example.com",
  "software": [
    {"product": "nginx", "version": "1.18.0"},
    {"product": "WordPress", "version": "6.3.1"}
  ],
  "cve_hits": [
    {
      "product": "WordPress 6.3.1",
      "top_cve": "CVE-2023-39320",
      "top_cvss": 9.8,
      "cve_count": 3
    }
  ],
  "max_cvss": 9.8,
  "priority": "CRITICAL"
}

prioridad: CRÍTICA (cvss ≥ 9) · ALTA (≥ 7) · MEDIA (≥ 4) · BAJA. Si la flota de escáneres ascendente no está disponible, el endpoint devuelve una estructura de resultado vacío en lugar de retornar errores 5xx.

GET /api/v2/dominios

Enumera todos los dominios en tu cuenta con sus puntuaciones de riesgo más recientes y verificaciones.

GET /api/v2/domains Bearer
{
  "domains": [
    {
      "id": "uuid",
      "domain": "example.com",
      "country": "DE",
      "status": "active",
      "paid": true,
      "risk_score": 42,
      "scanned_at": "2025-03-10T09:15:00Z",
      "checks": [/* latest check array */],
      "scan_history": [{"date":"…","risk":42}]
    }
  ]
}

POST /api/v2/dominios

Añade un dominio a tu cuenta y pon en cola un escaneo en segundo plano.

POST /api/v2/domains Bearer
CampoTipoDescripción
domainstringDominio a agregar, p. ej. "mycompany.cz"
countrystringCódigo de país ISO (opcional — detectado automáticamente desde TLD)
{
  "id": "uuid",
  "domain": "mycompany.cz",
  "status": "scanning",
  "message": "Domain added — scan starting now"
}

GET /api/v2/domains/{domain_id}/informe

Obtén el último reporte de scan completo para un dominio. Los usuarios gratuitos ven un subconjunto; los usuarios de pago ven los 27 controles incluyendo validación de CVE activo nuclei y resumen con IA.

GET /api/v2/domains/{domain_id}/report Bearer
{
  "domain": "example.com",
  "risk_score": 42,
  "scanned_at": "2025-03-10T09:15:00Z",
  "paid": true,
  "critical": 1,
  "warnings": 3,
  "informational": 2,
  "locked_count": 0,
  "verified_at": "2026-04-08T10:00:00Z",
  "checks": [
    {
      "check": "ssrf",
      "status": "info",
      "confidence": "informational",
      "title": "A10: 3 SSRF surface indicator(s)",
      "detail": "Surface area detected (not confirmed vulnerabilities)…",
      "score_impact": 0
    }
  ]
}

Cada objeto de verificación ahora incluye un campo confidence: "confirmed" (puntuado) o "informational" (sin penalización, solo indicador de superficie). Los hallazgos informativos nunca se cuentan en warnings ni critical.

GET /domains/{domain_id}/verify-token

Devuelve el desafío de propiedad activo emitido por el orquestador de verificación. SwarmHawk admite dos métodos de verificación — registro TXT de DNS o carga de archivo HTTP. Llama a POST /domains/{domain_id}/verify con method: "dns" o "http" una vez que el registro/archivo se haya publicado.

GET /domains/{domain_id}/verify-token Bearer
{
  "domain": "example.com",
  "verified_at": null,
  "orchestrator_state": "pending",
  "method": {
    "name": "DNS TXT record",
    "record_name": "_swarmhawk-verify.example.com",
    "record_value": "swarmhawk-verify=a3f7b2c1…",
    "hint": "Add a TXT record named _swarmhawk-verify.example.com with the value above. Click 'Check DNS' once propagated."
  },
  "methods": [
    {
      "type": "dns",
      "name": "DNS TXT record",
      "record_name": "_swarmhawk-verify.example.com",
      "record_value": "swarmhawk-verify=a3f7b2c1…",
      "hint": "Add a TXT record …"
    },
    {
      "type": "http",
      "name": "File upload",
      "path": "/.well-known/swarmhawk-verify.txt",
      "url": "https://example.com/.well-known/swarmhawk-verify.txt",
      "body": "swarmhawk-verify=a3f7b2c1…",
      "hint": "Upload a file at the URL containing the body above. Click 'Check File' once it returns 200."
    }
  ]
}

La entrada del método HTTP solo está presente cuando el orquestador ha emitido un desafío http_path. Si el orquestador es inaccesible, el endpoint devuelve 503 no_verification_orchestrator.

POST /dominios/{domain_id}/verificar

Solicite al orquestador que confirme la propiedad mediante el método seleccionado. Si tiene éxito, domains.verified_at se escribe y se devuelve en respuestas de reportes posteriores. El orquestador almacena en caché las verificaciones positivas durante 7 días.

POST /domains/{domain_id}/verify Bearer

Cuerpo de la solicitud (opcional, por defecto dns):

{ "method": "dns" }   // or "http"

Respuesta exitosa:

{ "verified": true, "method": "dns" }

Respuesta aún no encontrada:

{ "verified": false, "state": "pending", "method": "dns", "detail": "DNS-TXT record not found yet" }

GET /api/v2/dominios/{domain_id}/historial

Tendencia de puntuación de riesgo a lo largo del tiempo — útil para construir dashboards o alertar sobre aumentos de puntuación.

GET /api/v2/domains/{domain_id}/history Bearer
{
  "domain": "example.com",
  "scans": [
    {"risk_score":42,"critical":1,"warnings":3,"scanned_at":"2025-03-10T09:15:00Z"},
    {"risk_score":38,"critical":0,"warnings":4,"scanned_at":"2025-02-10T08:00:00Z"}
  ]
}

GET /api/v2/domains/{domain_id}/nis2

Mapea los hallazgos del escaneo a los artículos de la Directiva NIS2. Devuelve una puntuación de cumplimiento y estado por artículo — adecuado como evidencia de auditoría para reguladores.

GET /api/v2/domains/{domain_id}/nis2 Bearer
{
  "domain": "example.com",
  "risk_score": 42,
  "nis2_score": 71,
  "articles": [
    {
      "article": "Art.21(2)(i)",
      "requirement": "Secure communications",
      "status": "met"
    },
    {
      "article": "Art.21(2)(h)",
      "requirement": "Supply chain security",
      "status": "warning"
    }
  ]
}

POST /intel

Genera un informe de amenazas impulsado por IA para tu cartera de dominios usando Claude. Devuelve un informe estructurado con resumen ejecutivo, hallazgos críticos y prioridades de remediación.

POST /intel Bearer
CampoTipoDescripción
domainsstringSeparados por comas: "example.com (riesgo:42), other.cz (riesgo:18)"
datestringFecha de hoy, p. ej. "10 de marzo de 2025"
{
  "text": "## Executive Summary\n\nYour domain portfolio shows...",
  "briefing": "…"
}

POST /api/v2/keys

Crea una nueva clave API para tu cuenta. Devuelve todas las claves incluyendo la nueva.

POST /api/v2/keys Bearer
{
  "keys": [
    {
      "key": "swh_3f8a2b1c4d5e6f7a8b9c0d1e2f3a4b5c",
      "calls_this_month": 0,
      "limit_per_month": 10,
      "active": true,
      "created_at": "2025-03-10T09:00:00Z"
    }
  ]
}

GET /api/v2/keys

Lista todas las claves API y su uso durante el mes actual.

GET /api/v2/keys Bearer
curl https://api.swarmhawk.com/api/v2/keys \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

DELETE /api/v2/keys/{key}

Revoke una clave API inmediatamente. Todas las solicitudes futuras con esta clave serán rechazadas.

DELETE /api/v2/keys/{key} Bearer
{ "revoked": "swh_3f8a2b1c…" }

API Business / Enterprise — /api/v1

La superficie /api/v1/* es la API de escritura de producción utilizada por clientes Business y Enterprise. Cada endpoint acepta X-API-Key: swh_… (recomendado para servidor a servidor) o Authorization: Bearer <jwt> (para herramientas propias).

URL Base https://api.swarmhawk.com

Control de niveles

  • Gratuito — Acceso a API denegado (403 API_ACCESS_REQUIRED).
  • Pro — Prueba de solo lectura con 10 llamadas. Los endpoints de escritura devuelven 403 business_required.
  • Empresa — 500 llamadas/mes, débito de cartera/derechos por escaneo/pentest/brecha.
  • Enterprise — llamadas ilimitadas; inscripción de administrador con límite de max_dominios por cliente y medición por llamada (detalles).

Flujo típico de distribuidor

# 1. Add a domain (returns the DNS challenge inline)
curl -X POST https://api.swarmhawk.com/api/v1/domains \
  -H "X-API-Key: swh_…" -H "Content-Type: application/json" \
  -d '{"domain":"acme.com"}'
# {"id":"…","domain":"acme.com","verification":{"state":"pending","dns_record_name":"_swarmhawk.acme.com","dns_record_value":"swh-verify=…"}}

# 2. Tenant adds the DNS TXT record, then verify
curl -X POST https://api.swarmhawk.com/api/v1/domains/{id}/verify \
  -H "X-API-Key: swh_…"
# {"verified":true,"state":"verified","method":"dns"}

# 3. Kick off a scan / pentest / breach lookup (returns job_id)
curl -X POST https://api.swarmhawk.com/api/v1/domains/{id}/scan -H "X-API-Key: swh_…"
# {"job_id":"…","status":"queued","domain":"acme.com","swarmhawk_job_id":"…"}

# 4. Poll the orchestrator-side job and pull results when status=done
curl https://api.swarmhawk.com/api/v1/jobs/{job_id} -H "X-API-Key: swh_…"
curl https://api.swarmhawk.com/api/v1/jobs/{job_id}/findings -H "X-API-Key: swh_…"
curl https://api.swarmhawk.com/api/v1/jobs/{job_id}/report -H "X-API-Key: swh_…"

POST /api/v1/keys

Emita una clave API para el usuario actual. Business: una clave, 500 llamadas/mes. Enterprise: una clave, ilimitadas (gestionadas por admin vía /admin/api/v1/enterprise/*). Solo JWT Bearer — no puede usar su primera clave para inicializarse a sí misma; el inicio de sesión del panel (o inscripción de admin para Enterprise) es el punto de entrada.

POST/api/v1/keysBearer only
curl -X POST https://api.swarmhawk.com/api/v1/keys -H "Authorization: Bearer …"
# { "keys": [{ "id":"…", "key_prefix":"swh_…", "calls_this_month":0, "limit_per_month":500 }],
#   "created": true, "is_trial": false, "full_key": "swh_…" }  ← plaintext shown ONCE

GET /api/v1/keys

Lista claves activas + uso del mes actual. El texto plano nunca se vuelve a mostrar. Solo JWT Bearer — los endpoints de gestión de claves no son accesibles con una clave API.

GET/api/v1/keysBearer only
{ "keys": [{ "id":"…", "key_prefix":"swh_3f8a2b1c",
            "calls_this_month":142, "limit_per_month":500,
            "cost_this_month_usd":"23.50", "last_used_at":"2026-05-12T19:01:00Z" }] }

POST /api/v1/keys/{key_id}/regenerate

Revoca la clave existente e emite una nueva. El nuevo texto plano se muestra una sola vez en la respuesta — la clave anterior deja de funcionar inmediatamente. Solo JWT Bearer.

POST/api/v1/keys/{key_id}/regenerateBearer only

DELETE /api/v1/keys/{key_id}

Revocar una clave. Idempotente. Solo Bearer JWT.

DELETE/api/v1/keys/{key_id}Bearer only

GET /api/v1/dominios

Enumera los dominios del usuario. Paginado; respeta los parámetros ?limit y ?offset.

GET/api/v1/domainsX-API-Key Bearer

POST /api/v1/dominios

Añade un dominio e inicia automáticamente la verificación del orquestador. Devuelve el desafío DNS-TXT en línea para que puedas entregarlo a tu inquilino sin una llamada de seguimiento. Gratuito para el cliente — los añadidos de dominios no debitan la cartera.

POST/api/v1/domainsX-API-Key Bearer

Cuerpo

CampoTipoRequeridoDescripción
domainstringyes4–253 caracteres, en minúsculas.
countrystring—ISO 3166-1 alpha-2. Se deriva automáticamente del TLD si está ausente.
industrystring—Etiqueta de forma libre para agrupación e informes.
primary_contactstring—Correo electrónico para enrutamiento de brechas/alertas.

Respuesta (201)

{
  "id": "d1-uuid",
  "domain": "acme.example.com",
  "country": "US",
  "verification": {
    "state": "pending",
    "dns_record_name": "_swarmhawk.acme.example.com",
    "dns_record_value": "swh-verify=Xk2…",
    "http_path": "/.well-known/swarmhawk-verify.txt",
    "http_body": "swh-verify=Xk2…",
    "expires_at": "2026-05-19T20:00:00Z"
  }
}

Errores: 403 tier_locked en límite; 409 domain_already_added en duplicado; 422 invalid_domain.

GET /api/v1/domains/{domain_id}

Detalle de dominio único: risk_score, last_scanned_at, verified_at, país, etc. 404 en caso de discrepancia.

GET/api/v1/domains/{domain_id}X-API-Key Bearer

PATCH /api/v1/domains/{domain_id}

Alterna auto_rescan_enabled para un dominio (el único campo mutable en este endpoint actualmente). Habilitar requiere tier Pro o superior (la puerta de características daily_rescan); deshabilitar siempre está permitido. Para cambiar industry, primary_contact o country, elimina y vuelve a agregar el dominio.

PATCH/api/v1/domains/{domain_id}Bearer only
curl -X PATCH https://api.swarmhawk.com/api/v1/domains/{id} \
  -H "Authorization: Bearer …" -H "Content-Type: application/json" \
  -d '{"auto_rescan_enabled": true}'
# { "ok": true }

DELETE /api/v1/domains/{domain_id}

Eliminación permanente de un dominio. Se elimina la fila, su estado de verificación y todos los registros de trabajos asociados. Libera una ranura contra el límite de nivel. Cuota +1.

DELETE/api/v1/domains/{domain_id}X-API-Key Bearer

POST /api/v1/domains/bulk-import

Carga múltiple de un CSV — cada fila es dominio,país (país es obligatorio, código ISO de 2 letras). La primera fila puede ser un encabezado dominio,país — se omite. Respeta el límite por cliente; las filas que lo superan se incluyen en la lista rechazadas con el motivo cuota excedida. Cuota +1 por llamada (no por fila).

POST/api/v1/domains/bulk-importX-API-Key Bearer

Devuelve {accepted: [...], rejected: [...]}. Disponible en los planes Business + Enterprise (funcionalidad: bulk_import).

GET /api/v1/domains/{domain_id}/history

Lista ordenada cronológicamente de escaneos anteriores + deltas de verificación para un dominio.

GET/api/v1/domains/{domain_id}/historyX-API-Key Bearer

GET /api/v1/domains/{domain_id}/verification

Obtención de solo lectura del estado actual del desafío de autorización del orquestador (DNS + ruta HTTP + valores de registro + vencimiento). Utilice esto si necesita volver a mostrar el desafío después de que la respuesta inicial de POST /api/v1/domains se pierda.

GET/api/v1/domains/{domain_id}/verificationX-API-Key Bearer
{
  "domain": "acme.example.com",
  "state": "pending",            // pending | verified | failed | expired
  "verified_at": null,
  "dns_record_name": "_swarmhawk.acme.example.com",
  "dns_record_value": "swh-verify=Xk2…",
  "http_path": "/.well-known/swarmhawk-verify.txt",
  "http_body": "swh-verify=Xk2…",
  "expires_at": "2026-05-19T20:00:00Z"
}

POST /api/v1/dominios/{domain_id}/verificar

Solicita al orquestador que ejecute la verificación. method=dns (predeterminado) realiza una búsqueda TXT; method=http obtiene https://<dominio><http_path> y compara con http_body.

POST/api/v1/domains/{domain_id}/verifyX-API-Key Bearer
curl -X POST https://api.swarmhawk.com/api/v1/domains/{id}/verify \
  -H "X-API-Key: swh_…" -H "Content-Type: application/json" \
  -d '{"method":"dns"}'
# {"verified":true,"state":"verified","method":"dns"}
# {"verified":false,"state":"pending","method":"dns","detail":"TXT record not found"}

Cuando verified:true, tanto domains.verified_at como la caché del orquestador se actualizan — las llamadas posteriores a scan/pentest/breach ya no devuelven domain_unverified.

POST /api/v1/domains/{domain_id}/scan

Envía un escaneo de superficie de ataque al orquestador. Sin verificación de dominio — cualquier dominio añadido es elegible. Business: débitos de billetera/entitlement por service_prices.attack_surface. Enterprise: registra una fila usage_events con precio efectivo por cliente, sin tocar billetera. Cuota +1 en 201.

POST/api/v1/domains/{domain_id}/scanX-API-Key Bearer

Respuesta (201)

{
  "job_id": "orch-uuid",        // poll at GET /api/v1/jobs/{job_id}
  "status": "queued",
  "domain": "acme.example.com",
  "swarmhawk_job_id": "sw-uuid"     // internal id, kept for audit
}

Errores: 402 INSUFFICIENT_BALANCE, 403 enterprise_inactive, 429 cooldown (ventana compartida de 24h aplicada por orquestador con prueba de penetración), 503 orchestrator_unavailable.

POST /api/v1/domains/{domain_id}/pentest

Envía una prueba de penetración con IA. El parámetro opcional rate_profile controla la agresividad del escaneo: stealth (3 rps) · regular (10 rps, predeterminado) · aggressive (25 rps). Todos los demás parámetros mantienen los valores predeterminados del orquestador. El mismo esquema de billetera y medición que /scan.

POST/api/v1/domains/{domain_id}/pentestX-API-Key Bearer
curl -X POST https://api.swarmhawk.com/api/v1/domains/{id}/pentest \
  -H "X-API-Key: swh_…" -H "Content-Type: application/json" \
  -d '{"rate_profile":"regular"}'
# {"job_id":"…","status":"queued","domain":"…","swarmhawk_job_id":"…"}

Misma superficie de errores que el escaneo, más 422 invalid_rate_profile.

POST /api/v1/domains/{domain_id}/breach-intel

Encola un trabajo de investigación en darknet que verifica fuentes de darknet para credenciales, hashes e información personal identificable vinculada a este dominio. Asincrónico — devuelve un job_id inmediatamente; consulta GET /api/v1/breach-intel/{job_id} para estado y hallazgos. El tiempo típico de ejecución de extremo a extremo es de 30–90 s. El dominio debe ser verificado. Business: descuenta cartera/derechos según service_prices.breach_intel. Enterprise: registra una fila usage_events con precio efectivo por cliente, sin afectar cartera. Cuota +1 en envío aceptado. Enfriamiento por dominio: 7 días (ventana de darknet del orquestador).

POST/api/v1/domains/{domain_id}/breach-intelX-API-Key Bearer

Response (202)

{
  "job_id": "sw-uuid",               // poll GET /api/v1/breach-intel/{job_id}
  "orchestrator_job_id": "orch-uuid",  // upstream id, kept for audit
  "status": "running",
  "domain": "acme.example.com",
  "billing_source": "wallet"           // or "entitlement" | "admin_override" | "enterprise_metered"
}

Errores: 402 INSUFFICIENT_BALANCE, 403 domain_unverified, 403 enterprise_inactive, 409 already_running (un trabajo ya está en curso para este dominio), 429 cooldown (ventana local de 7 días), 429 darknet_cooldown_active (ventana de 7 días impuesta por orquestador con next_available_at), 502 orchestrator_unavailable, 503 orchestrator_unavailable.

GET /api/v1/breach-intel/{job_id}

Consulta un trabajo de investigación en darknet. Con validación de propiedad; sin cuota. El backend consulta perezosamente al orquestador (regulación de 5 s) mientras la fila local esté en estado running, por lo que este endpoint puede llamarse frecuentemente sin sobrecargar flujo ascendente. Una vez que el trabajo alcanza un estado terminal (completed | failed | cancelled), las llamadas posteriores devuelven la fila cacheada sin ningún viaje al orquestador.

GET/api/v1/breach-intel/{job_id}X-API-Key Bearer

Response (200) — running

{
  "job_id": "sw-uuid",
  "orchestrator_job_id": "orch-uuid",
  "domain": "acme.example.com",
  "status": "running",
  "leak_count": null,
  "findings": [],
  "pagination": { "page":1, "page_size":50, "total":0, "total_pages":0 },
  "error": null,
  "billing_source": "wallet",
  "requested_at": "2026-05-19T20:23:35Z",
  "completed_at": null
}

Response (200) — completed

{
  "job_id": "sw-uuid",
  "domain": "acme.example.com",
  "status": "completed",
  "leak_count": 4,
  "findings": [
    {
      "id": 2,
      "email": "[email protected]",
      "username": "alice",
      "breach_name": "leakdb",
      "breach_date": null,
      "has_password": true,                              // plaintext available via /reveal
      "password": { "sha1":"6DD85DDA386874EC…", "encrypted":true },
      "risk_level": "high"
    }
  ],
  "pagination": { "page":1, "page_size":50, "total":4, "total_pages":1 },
  "error": null,
  "billing_source": "wallet",
  "requested_at": "2026-05-19T20:23:35Z",
  "completed_at": "2026-05-19T20:23:43Z"
}

Response (200) — failed

{
  "job_id": "sw-uuid",
  "status": "failed",
  "error": "no_data_available",       // or "orchestrator_job_not_found" | "orchestrator_failed"
  "leak_count": null,
  "findings": [],
  "billing_source": "wallet",
  "requested_at": "2026-05-19T20:23:35Z",
  "completed_at": "2026-05-19T20:24:01Z"
}

En error = "no_data_available" o "orchestrator_job_not_found", el consumo de cartera/derechos se reembolsa automáticamente — sin acción requerida del llamador.

POST /api/v1/breach-intel/{job_id}/reveal/{finding_id}

Descifra una contraseña en texto plano de un hallazgo en darknet. Solo propietario (intentos entre inquilinos devuelven 404 — privado de existencia). El dominio debe seguir verificado por orquestador en el momento de la llamada. El texto plano se devuelve en línea y NUNCA se persiste en la BD de SwarmHawk; cada llamada escribe una fila admin_audit_log. Sin costo de cuota.

POST/api/v1/breach-intel/{job_id}/reveal/{finding_id}X-API-Key Bearer

Response (200)

{
  "plaintext": "Hunter2!",
  "revealed_at": "2026-05-19T20:25:10Z"
}

Errores: 403 domain_unverified (verificación caducada desde que se ejecutó el escaneo), 404 finding_not_found (id no es parte de este trabajo — también se devuelve para entre inquilinos), 502 orchestrator_reveal_failed. Solo hallazgos con has_password: true en la respuesta GET pueden ser revelados.

GET /api/v1/jobs/{job_id}

Proxy de estado de trabajo hacia el orquestador. El job_id aquí es el id del orquestador devuelto por POST /scan o /pentest. La propiedad se valida en el servidor — 404 en caso de desajuste (existencia-privada). GET = sin cuota.

GET/api/v1/jobs/{job_id}X-API-Key Bearer
{
  "id": "orch-uuid",
  "status": "running",       // queued | running | done | failed | cancelled
  "created_at": "…",
  "updated_at": "…",
  "progress_pct": 42,        // integer 0–100 (NOT a 0–1 fraction)
  "phase": "recon",          // free-form server label, display-only
  "target": "acme.example.com"
}

Progress is reported as progress_pct (integer percentage, 0–100) plus a free-form phase label — both pass through verbatim from the scan engine, so treat unknown phase values as display-only.

Sondea cada 5–10 segundos mientras status sea queued o running. Una vez done, obtén los hallazgos / reporte a continuación.

GET /api/v1/jobs/{job_id}/findings

Lista estructurada de hallazgos (vulnerabilidades, servicios expuestos, configuraciones débiles, etc.). Se devuelve una vez que status == 'done'.

GET/api/v1/jobs/{job_id}/findingsX-API-Key Bearer

Returns a bare JSON array. Each item is emitted verbatim by the scan engine, so treat fields beyond the common ones below as additive.

[
  {
    "id": "f-1",
    "severity": "high",        // info | low | medium | high | critical
    "title": "Exposed admin panel",
    "target": "admin.acme.example.com",
    "description": "…"
  }
]

Errors: 404 findings_not_available if no findings exist for the job yet (still running, or output not enabled for your account); 404 not_found for an unknown / cross-tenant job; 502 api_get_findings_unavailable if the scan service is unreachable.

GET /api/v1/jobs/{job_id}/report

Informe JSON completo (resumen ejecutivo + hallazgos + recomendaciones). Disponible una vez que done.

GET/api/v1/jobs/{job_id}/reportX-API-Key Bearer

Returns a JSON object wrapping the engine-rendered structured report. The nested report object passes through from the scan engine.

{
  "status": "done",
  "generated_at": "2026-06-03T09:12:44Z",
  "model": "claude-…",
  "report": {
    "executive_summary": "…",
    "findings": [ /* same items as /findings */ ],
    "recommendations": [ "…" ]
  }
}

Errors: 404 report_not_available if the report has not been generated for this job (still running, or report generation not enabled for your account); 502 api_get_report_unavailable if the scan service is unreachable.

GET /api/v1/jobs/{job_id}/report.pdf

El mismo informe renderizado como PDF (flujo binario con Content-Disposition ascendente). Apto para redistribución directa a tu tenant.

GET/api/v1/jobs/{job_id}/report.pdfX-API-Key Bearer

On success returns 200 with Content-Type: application/pdf and the upstream Content-Disposition filename.

PDF generation is not enabled on every account / job type. When no PDF is available you get 404 {"error":"report_not_available"} with a human-readable detail — not a generic 502. A 502 api_get_report_pdf_unavailable means the scan service itself is unreachable (retry with back-off). Fall back to GET …/report (JSON) when you only need the data.

Nivel Empresarial

El nivel Enterprise está diseñado para proveedores de hosting, MSSPs y otros revendedores que ejecutan SwarmHawk como una API de marca blanca en nombre de múltiples inquilinos. Se requiere inscripción de administrador (sin compra de autoservicio) y negociación contractual — contacta con ventas para incorporarse.

Qué diferencia hay con Business

  • Límite máximo de dominios por cliente — tu contrato establece max_domains (p. ej. 100, 500, 5000); la solicitud (N+1)ésima POST /api/v1/domains devuelve 403 tier_locked con feature:"domains" y un cuerpo limit/current.
  • Llamadas API ilimitadas — tu clave incluye limit_per_month: null; se omite la cuota mensual que aplica a Pro/Business.
  • Medición por llamada — cada llamada de scan, pentest e intelligence de brechas se registra en un registro usage_events inmutable con el precio efectivo por cliente, recuperable mediante GET /api/v1/usage. Los precios por servicio pueden ser sobrescritos por contrato por un administrador (en caso contrario, recurren a la tarifa global).
  • Sin cartera / sin Stripe — La facturación empresarial se realiza fuera de la plataforma en un ciclo de facturación mensual. El saldo de cartera de tu revendedor es irrelevante.
  • Solo API — Los clientes Enterprise no inician sesión en el panel. El equipo de ventas te entrega tu clave portadora fuera de banda; todo lo siguiente funciona con X-API-Key: swh_….

Endpoints disponibles

Los clientes Enterprise utilizan la superficie Business existente /api/v1/* más el nuevo GET /api/v1/usage:

  • POST /api/v1/keys, GET /api/v1/keys — ver tus metadatos clave propios (la clave en texto plano solo se muestra una vez en la inscripción / regeneración).
  • POST /api/v1/domains — sujeto al límite max_domains por cliente.
  • POST /api/v1/domains/{id}/verify
  • POST /api/v1/domains/{id}/scan
  • POST /api/v1/domains/{id}/pentest
  • POST /api/v1/domains/{id}/breach-intel · GET /api/v1/breach-intel/{job_id}
  • GET /api/v1/usage — Solo para empresa (véase abajo).

GET /api/v1/usage

Agregados de uso por dominio para un cliente Enterprise en un período de facturación mensual determinado. Úselo para reconciliar su factura mensual o para facturar a sus propios inquilinos por dominio.

GET /api/v1/usage?period=YYYY-MM X-API-Key Bearer

Parámetros de consulta

NombreTipoPredeterminadoDescripción
periodstringmes actualFormato YYYY-MM. Se traduce a [YYYY-MM-01, próximo-mes-01) UTC. Los valores con formato incorrecto devuelven 400 invalid_period.

Ejemplo

curl https://api.swarmhawk.com/api/v1/usage?period=2026-05 \
  -H "X-API-Key: swh_…"

Respuesta

{
  "period": "2026-05",
  "currency": "USD",
  "domains": [
    {
      "domain_id": "d1-uuid",
      "domain": "acme.example.com",
      "scans_count": 12,
      "pentests_count": 3,
      "breach_lookups_count": 8,
      "total_cost_usd": 234.50
    }
  ],
  "totals": {
    "scans_count": 47,
    "pentests_count": 11,
    "breach_lookups_count": 22,
    "total_cost_usd": 1284.75
  }
}

Notas

  • El array domains contiene solo dominios con al menos un evento en el período. Los dominios que posees pero que no utilizaste ese mes se omiten — consulta GET /api/v1/domains para el inventario completo.
  • Si un dominio se elimina entre el evento y la consulta, su fila sigue apareciendo con domain_id: null y domain: "<deleted>" — el registro de auditoría se preserva.
  • El costo refleja el precio efectivo por llamada en el momento del evento: anulación de contrato por cliente si está configurada, de lo contrario, la tarifa de la tarjeta de precios del servicio global.
  • 403 enterprise_only se devuelve a cualquier nivel que no sea Enterprise que acceda a este endpoint.

Comportamiento de desactivación

Si tu cuenta Enterprise está pausada por un administrador (falta de pago, fin de contrato, etc.), todas las llamadas a /api/v1/* — lectura y escritura — devuelven:

HTTP 403
{ "detail": { "error": "enterprise_inactive" } }

La clave de API no se revoca (por lo que la reactivación restaura el acceso sin emitir nuevas claves), y los usage_events + domains históricos se conservan. Contacte a ventas para reactivar.

SDK de Python

El SDK de Python de SwarmHawk proporciona a las plataformas de seguridad una interfaz programática limpia para extraer hallazgos, configurar integraciones push y consumir bundles de STIX 2.1, sin necesidad de HTTP raw.

# Install pip install httpx # only dependency # Download curl -O https://raw.githubusercontent.com/hastikdan/swarmhawk/main/sdk/swarmhawk_sdk.py
# Quick-start from swarmhawk_sdk import SwarmHawkClient client = SwarmHawkClient(api_key="swh_...") # Paginated high-risk domains for domain in client.iter_alerts(min_risk=80): print(domain["domain"], domain["risk_score"]) # Single domain detail result = client.domain("example.com") print(result["max_cvss"], result["priority"]) # STIX 2.1 bundle for your threat intel platform bundle = client.stix_bundle(min_risk=70) print(len(bundle["objects"]), "STIX objects")

Métodos del SDK

MétodoDescripciónDevuelve
domains(min_risk, country, limit, offset)Resultados de escaneo paginadoslist[dict]
domain(name)Detalle completo de un único dominiodict
alerts(min_risk, since, limit)Hallazgos de alto riesgo, opcionales desde datetimelist[dict]
iter_alerts(min_risk, page_size)Generador — pagina automáticamente todos los resultadosIterator[dict]
stix_bundle(min_risk, limit)Bundle STIX 2.1 desde endpoint /taxiidict
integrations()Lista integraciones push configuradaslist[dict]
configure_integration(service, config)Guarda las credenciales de integracióndict
test_integration(service, config)Prueba la conectividad sin guardar{ok, message}

API de Integración

⚠ Las integraciones están actualmente tras un feature flag. Con INTEGRATIONS_ENABLED=false (la configuración predeterminada de la plataforma), todos los endpoints /integrations* devuelven HTTP 410 { "error": "feature_disabled" }. Contacta a [email protected] si necesitas reactivar esta función en tu cuenta.

Cuando esté habilitado, configure integraciones push para que SwarmHawk envíe automáticamente los hallazgos críticos a sus plataformas de seguridad en el momento en que se detecten (riesgo ≥ 70).

GET /integraciones

Enumera todas las integraciones configuradas para el usuario autenticado. Los secretos están enmascarados.

curl -H "Authorization: Bearer swh_..." \ https://api.swarmhawk.com/integrations

POST /integraciones/{service}

Guardar o actualizar configuración de integración. service es uno de: splunk · sentinel · crowdstrike · gravityzone · cortex · jira · servicenow · webhook · stix

curl -X POST \ -H "Authorization: Bearer swh_..." \ -H "Content-Type: application/json" \ -d '{"config": {"hec_url": "https://splunk:8088", "hec_token": "...", "index": "security"}, "enabled": true}' \ https://api.swarmhawk.com/integrations/splunk

POST /integraciones/{servicio}/prueba

Prueba la conectividad sin guardar. Devuelve {"ok": true, "message": "..."}

curl -X POST \ -H "Authorization: Bearer swh_..." \ -H "Content-Type: application/json" \ -d '{"config": {"url": "https://webhook.site/xxx", "secret": "optional"}}' \ https://api.swarmhawk.com/integrations/webhook/test

DEL /integraciones/{servicio}

Eliminar una configuración de integración.

Servicios compatibles

ServicioMétodo de autenticaciónActivadorTipo de payload
splunkToken HECriesgo ≥ 70evento JSON alineado con CIM
sentinelHMAC de clave compartida del área de trabajoriesgo ≥ 70Campos listos para KQL plana (_s/_d/_b)
crowdstrikeCredenciales de cliente OAuth2riesgo ≥ 70IOC (type=dominio, action=detect/prevent)
gravityzoneClave de acceso Bearerriesgo ≥ 70JSON-RPC createCustomRule
cortexSHA-256 HMAC (api_key_id/nonce/ts)riesgo ≥ 70Alerta externa con etiquetas MITRE
jiraBásica (email:api_token)riesgo ≥ 70 AND cvss ≥ 7Incidencia en formato ADF con tablas de CVE/software
servicenowBásica (usuario:contraseña)riesgo ≥ 70Incidente con mapeo de urgencia/impacto/SLA
webhookFirma HMAC-SHA256 opcionalriesgo ≥ 70Carga JSON enriquecida
stixBearer (lectura vía /taxii)Basado en extracciónObjetos DomainName + Vulnerability de STIX 2.1

STIX / TAXII 2.1

SwarmHawk expone un endpoint compatible con TAXII 2.1. Conecta cualquier plataforma de inteligencia de amenazas (OpenCTI, MISP, ThreatConnect, Anomali) para extraer hallazgos de SwarmHawk como objetos STIX 2.1.

GET /taxii/colecciones/

Punto de conexión de descubrimiento TAXII — devuelve metadatos de colecciones.

curl -H "Authorization: Bearer swh_..." \ https://api.swarmhawk.com/taxii/collections/

GET /taxii/collections/swarmhawk/objects/

Devuelve un paquete STIX 2.1 de tus dominios de alto riesgo como objetos domain-name, vulnerability y relationship.

curl "https://api.swarmhawk.com/taxii/collections/swarmhawk/objects/?min_risk=70&limit=200" \ -H "Authorization: Bearer swh_..."
ParámetroPredeterminadoDescripción
min_risk70Puntuación de riesgo mínima (0–100)
limit100Máximo de objetos (1–500)

Tipos de objetos STIX devueltos

TipoContenido
domain-nameValor de dominio, puntuación de riesgo, prioridad, país
vulnerabilityID de CVE, puntuación CVSS, descripción
relationshipnombre-de-dominio → relacionado-con → vulnerabilidad

Todos los IDs de objeto son determinísticos (UUID5) — el mismo dominio siempre produce el mismo ID STIX en todas las generaciones de bundles, permitiendo la deduplicación adecuada en las plataformas de inteligencia de amenazas posteriores.

Scripts de Adaptador

Scripts independientes de Python para plataformas donde prefieres un pull programado (cron / Lambda / Azure Function) sobre el conector push siempre activo. Cada script obtiene las alertas de SwarmHawk y las envía a la plataforma de destino en una única ejecución.

Todos los adaptadores requieren solo pip install httpx y aceptan tanto flags de CLI como variables de entorno.
PlataformaScriptRiesgo mínimo por defectoDescargar
Splunk SIEM splunk_ta.py 70 ↓ splunk_ta.py
Microsoft Sentinel sentinel_connector.py 70 ↓ sentinel_connector.py
CrowdStrike Falcon crowdstrike_adapter.py 80 ↓ crowdstrike_adapter.py
Bitdefender GravityZone gravityzone_adapter.py 80 ↓ gravityzone_adapter.py
Palo Alto Cortex XDR cortex_adapter.py 75 ↓ cortex_adapter.py
Jira jira_adapter.py 70 + cvss ≥ 7 ↓ jira_adapter.py
ServiceNow servicenow_adapter.py 70 ↓ servicenow_adapter.py
🐙 Todos los scripts también están disponibles en el repositorio SwarmHawk en GitHub bajo sdk/adapters/.

Adaptador TA Splunk

# One-line download + run curl -O https://raw.githubusercontent.com/hastikdan/swarmhawk/main/sdk/adapters/splunk_ta.py pip install httpx python splunk_ta.py --api-key swh_... --min-risk 70
MarcadorVariable de entornoDescripción
--api-keySWARMHAWK_API_KEYClave API de SwarmHawk
--min-riskSWARMHAWK_MIN_RISKPuntuación de riesgo mínima (predeterminado: 70)
--base-urlSWARMHAWK_BASE_URLURL base de la API
--indexSWARMHAWK_SPLUNK_INDEXNombre del índice de Splunk (predeterminado: main)

Emite eventos sourcetype=swarmhawk:scan con campos alineados a CIM: dest, vendor_product, category, severity.

Adaptador de Microsoft Sentinel

curl -O https://raw.githubusercontent.com/hastikdan/swarmhawk/main/sdk/adapters/sentinel_connector.py python sentinel_connector.py \ --api-key swh_... \ --workspace-id <WORKSPACE_ID> \ --shared-key <PRIMARY_OR_SECONDARY_KEY>
MarcarVariable de entornoDescripción
--workspace-idAZURE_WORKSPACE_IDID del espacio de trabajo de Log Analytics
--shared-keyAZURE_SHARED_KEYClave compartida primaria o secundaria
--log-typeAZURE_LOG_TYPENombre de tabla personalizado (predeterminado: SwarmHawk)
--min-riskSWARMHAWK_MIN_RISKPuntuación de riesgo mínima (predeterminado: 70)

Los datos se almacenan en la tabla personalizada SwarmHawk_CL. Ejemplo de KQL: SwarmHawk_CL | where RiskScore_d >= 80 | sort by TimeGenerated desc

Adaptador CrowdStrike Falcon

curl -O https://raw.githubusercontent.com/hastikdan/swarmhawk/main/sdk/adapters/crowdstrike_adapter.py python crowdstrike_adapter.py \ --api-key swh_... \ --cs-client-id <CLIENT_ID> \ --cs-client-secret <CLIENT_SECRET>
MarcarVariable de entornoDescripción
--cs-client-idCS_CLIENT_IDID de cliente de Falcon API
--cs-client-secretCS_CLIENT_SECRETSecreto del cliente de la API de Falcon
--cs-base-urlCS_BASE_URLURL base de Falcon (predeterminada: api.crowdstrike.com)
--min-riskSWARMHAWK_MIN_RISKPuntuación de riesgo mínima (por defecto: 80)

Envía dominios como IOCs (type=domain) en lotes de 200. La acción es prevent para malware/phishing confirmados, detect para exposición a CVE.

Adaptador Bitdefender GravityZone

curl -O https://raw.githubusercontent.com/hastikdan/swarmhawk/main/sdk/adapters/gravityzone_adapter.py python gravityzone_adapter.py \ --api-key swh_... \ --gz-api-url https://cloud.gravityzone.bitdefender.com/api/v1.0/jsonrpc/push \ --gz-access-key <KEY> \ --gz-company-id <ID>
BanderaVariable de entornoDescripción
--gz-api-urlGZ_API_URLPunto final JSON-RPC de GravityZone
--gz-access-keyGZ_ACCESS_KEYClave de acceso API de GravityZone
--gz-company-idGZ_COMPANY_IDID de empresa/inquilino
--min-riskSWARMHAWK_MIN_RISKPuntuación de riesgo mínima (predeterminado: 80)

Crea reglas de red personalizadas mediante createCustomRule. La acción es block para malware/phishing, report para exposición de CVE.

Adaptador Palo Alto Cortex XDR

curl -O https://raw.githubusercontent.com/hastikdan/swarmhawk/main/sdk/adapters/cortex_adapter.py python cortex_adapter.py \ --api-key swh_... \ --xdr-api-key <KEY> \ --xdr-api-key-id <ID> \ --xdr-fqdn <tenant>.xdr.us.paloaltonetworks.com
MarcarVariable de entornoDescripción
--xdr-api-keyXDR_API_KEYClave de API de Cortex XDR
--xdr-api-key-idXDR_API_KEY_IDID numérico de clave API
--xdr-fqdnXDR_FQDNEl FQDN de su tenant (sin https://api-)
--min-riskSWARMHAWK_MIN_RISKPuntuación de riesgo mínimo (predeterminado: 75)

Envía alertas externas con etiquetas de técnicas MITRE ATT&CK (T1566, T1190, T1046, T1557…). Lotes de 100 por llamada API.

Adaptador Jira

curl -O https://raw.githubusercontent.com/hastikdan/swarmhawk/main/sdk/adapters/jira_adapter.py python jira_adapter.py \ --api-key swh_... \ --jira-base-url https://yourcompany.atlassian.net \ --jira-email [email protected] \ --jira-token <API_TOKEN> \ --jira-project SEC
MarcarVariable de entornoDescripción
--jira-base-urlJIRA_BASE_URLURL de Atlassian Cloud
--jira-emailJIRA_EMAILCorreo electrónico de cuenta Atlassian
--jira-tokenJIRA_TOKENToken de API de Atlassian (id.atlassian.com → Security)
--jira-projectJIRA_PROJECTClave del proyecto (predeterminado: SEC)
--jira-issue-typeJIRA_ISSUE_TYPETipo de incidencia (predeterminado: Bug)
--min-cvssSWARMHAWK_MIN_CVSSCVSS mínimo para crear ticket (predeterminado: 7.0)

Crea incidencias ADF estructuradas con tabla de resumen de riesgos, hallazgos de CVE, stack de software, controles fallidos, bullets de remediación y etiqueta NIS2. Se ejecuta solo cuando riesgo ≥ 70 Y cvss ≥ min_cvss para evitar spam de tickets.

Adaptador de ServiceNow

curl -O https://raw.githubusercontent.com/hastikdan/swarmhawk/main/sdk/adapters/servicenow_adapter.py python servicenow_adapter.py \ --api-key swh_... \ --snow-instance yourcompany \ --snow-user admin \ --snow-password <PASSWORD>
MarcarVariable de entornoDescripción
--snow-instanceSNOW_INSTANCESubdominio de instancia de ServiceNow (sin .service-now.com)
--snow-userSNOW_USERNombre de usuario de ServiceNow
--snow-passwordSNOW_PASSWORDContraseña de ServiceNow
--snow-tableSNOW_TABLETabla de destino (predeterminado: incident)
--min-riskSWARMHAWK_MIN_RISKPuntuación de riesgo mínima (predeterminado: 70)
PrioridadUrgenciaImpactoobjetivo de SLA
CRITICAL114 horas
HIGH1224 horas
MEDIUM227 días
LOW / INFO3330 días

Objetos de Respuesta

Verificar objeto

CampoTipoDescripción
checkstringIdentificador de verificación (consulte Nombres de verificación a continuación)
statusstringok · warning · critical · locked
titlestringHallazgo legible de una línea
detailstringExplicación completa con evidencia
score_impactnumberPuntos agregados a la puntuación de riesgo (0–40)

Interpretación de puntuación de riesgo

PuntuaciónNivelSignificado
0 – 29RIESGO BAJOPostura de seguridad sólida, problemas menores
30 – 59RIESGO MEDIOProblemas destacados que requieren atención
60 – 100RIESGO ALTOHallazgos críticos, acción inmediata requerida

Verificar Nombres

Cada entrada en el array checks[] de un informe de escaneo lleva un identificador check. La lista exhaustiva de identificadores emitidos por el escáner actualmente (fuente: backend/scanhawk_translator.py + backend/post_scan_processor.py):

verificaciónGrupoDescripción
tls_protocolTLSVersión TLS negociada (marca TLS < 1.2)
tls_cipherTLSConjuntos de cifrado débiles
tls_cert_expiryTLSVencimiento de certificado / ya expirado
tls_self_signedTLSCertificado autofirmado
tls_handshakeTLSErrores de protocolo de enlace TLS
email_dmarcEmailDMARC ausente o débil (p=none)
mx_blacklistEmailHost MX en una lista de bloqueo pública
blacklistReputationDominio o registro A en una lista de bloqueo pública (Spamhaus / URLhaus / Safe Browsing)
ip_reputationReputationSeñales de reputación de IP de alojamiento / geo / ASN
cve_matchVulnsHuella digital de software coincidió con CVEs conocidas (CVSS + KEV + EPSS)
exposed_gitExposureDirectorio /.git/ público
exposed_envExposureArchivo .env público
mixed_contentWebLa página HTTPS carga subrrecursos HTTP
sri_missingWebIntegridad de subrecursos ausente en scripts de terceros
cookies_secureWebCookies sin los atributos Secure / HttpOnly / SameSite
takeover_riskDNSSubdominio huérfano / candidato a takeover
security_txtHygieneFalta /.well-known/security.txt (RFC 9116)
whois_privacyHygieneProtección de privacidad WHOIS activada / desactivada
ai_summaryReportingAnálisis de amenazas generado por IA (solo usuarios de pago)

Las verificaciones granulares (p. ej. tls_protocol, tls_cipher) se agrupan bajo categorías más amplias (TLS, DNS, Headers, etc.) para su visualización en el dashboard. El informe PDF utiliza etiquetas adicionales orientadas al usuario (véase backend/main.py:CHECK_LABELS), pero los identificadores JSON anteriores conforman la superficie canónica.

¿Listo para empezar a construir?

Obtén tu clave API gratuita en www.swarmhawk.com → Iniciar sesión → Cuenta → Claves API

Obtener Clave API Gratuita →
Explorador Interactivo

Pruébalo en Vivo

Explorador API completamente interactivo — ejecuta solicitudes reales contra la API de SwarmHawk directamente desde tu navegador. Pega tu clave API en el botón Autorizar para desbloquear endpoints autenticados.

Fuente de esquema: https://api.swarmhawk.com/openapi.json