← Back
v2.0 · REST + MCP

SwarmHawk API

The SwarmHawk API gives you programmatic access to 23 automated security checks plus 3,000+ active nuclei CVE templates — SSL, DNS, CVEs with active exploit confirmation, breach exposure, typosquats, AI threat analysis and more — for any domain. Use it to build security workflows, automate due diligence, or wire SwarmHawk into your AI assistant via MCP.

Base URL https://swarmhawk.com/api
MCP URL https://swarmhawk.com/api/mcp
📘 All responses are JSON. All requests with a body must set Content-Type: application/json.

Quick Start — scan a domain in 30 seconds

# 1. Create a free API key at www.swarmhawk.com → Account → API Keys
# 2. Run your first scan:

curl -X POST https://swarmhawk.com/api/api/v2/scan \
  -H "X-API-Key: swh_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"domain": "example.com"}'
import requests

API_KEY = "swh_your_key_here"

resp = requests.post(
    "https://swarmhawk.com/api/api/v2/scan",
    headers={"X-API-Key": API_KEY},
    json={"domain": "example.com"}
)
data = resp.json()
print(f"Risk score: {data['risk_score']} · {data['critical']} critical findings")
const res = await fetch("https://swarmhawk.com/api/api/v2/scan", {
  method: "POST",
  headers: {
    "X-API-Key": "swh_your_key_here",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({ domain: "example.com" })
});
const data = await res.json();
console.log(`Risk: ${data.risk_score} — ${data.critical} critical`);

Authentication

SwarmHawk uses two authentication methods depending on the endpoint:

MethodHeaderUsed for
API KeyX-API-Key: swh_…/api/v2/* developer endpoints
Session TokenAuthorization: Bearer <token>User dashboard, account management
None/public-scan, /health
🔑 Get your API key at www.swarmhawk.com → Sign In → Account → API Keys. Free keys include 10 API calls/month. Upgrade to Professional ($49/mo, billed yearly) for higher limits.

API Key format

swh_3f8a2b1c4d5e6f7a8b9c0d1e2f3a4b5c

Errors & Rate Limits

HTTP status codes

CodeMeaning
200Success
400Bad request — check your request body
401Missing or invalid API key / session token
403Forbidden — feature requires a paid plan
429Rate limit exceeded
500Server error — retry after 30 seconds

Error response shape

{
  "detail": "Invalid API key"
}

Rate limits

PlanLimit
Free API key10 calls / month
Professional ($49/mo, billed yearly)Higher limits — contact us
/public-scanNo key required · throttled by IP
⚠ The backend runs on Render free tier. First request after inactivity may take 15–30 seconds to cold-start. Subsequent requests are fast.

POST /api/v2/scan

Run a full 22-check security scan on any domain. Returns a risk score, detailed findings, and (for paid users) AI threat analysis. Results are saved to your account.

POST /api/v2/scan X-API-Key

Request body

FieldTypeRequiredDescription
domainstringrequiredDomain to scan, e.g. "example.com"

Response

{
  "domain": "example.com",
  "risk_score": 42,
  "critical": 1,
  "warnings": 3,
  "scanned_at": "2025-03-10T09:15:00Z",
  "checks": [
    {
      "check": "ssl",
      "status": "ok",
      "title": "SSL valid for 84 days",
      "detail": "Certificate issued by Let's Encrypt. Expires 2025-06-02.",
      "score_impact": 0
    },
    {
      "check": "breach",
      "status": "critical",
      "title": "4,200 breached accounts found",
      "detail": "Found in LinkedIn 2021 breach. Rotate all credentials.",
      "score_impact": 25
    }
  ]
}
curl -X POST https://swarmhawk.com/api/api/v2/scan \
  -H "X-API-Key: swh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"domain":"example.com"}'
resp = requests.post(
    "https://swarmhawk.com/api/api/v2/scan",
    headers={"X-API-Key": API_KEY},
    json={"domain": "example.com"}
)
data = resp.json()
# data["risk_score"], data["checks"]
const r = await fetch("https://swarmhawk.com/api/api/v2/scan", {
  method:"POST",
  headers:{"X-API-Key":key,"Content-Type":"application/json"},
  body:JSON.stringify({domain:"example.com"})
});
const d = await r.json();

POST /public-scan

Anonymous scan — no API key required. Returns a subset of checks with some results locked. Use this for demos or embeds. Results are not saved.

POST /public-scan No auth
FieldTypeDescription
domainstringDomain to scan
{
  "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

Fast fingerprint scan — detects software stack and checks for known CVEs without a full scan. Response in ~3 seconds. No result saved.

GET /scan/passive?domain=example.com Bearer
{
  "domain": "example.com",
  "software": [
    {"product": "nginx", "version": "1.18.0"},
    {"product": "WordPress", "version": "6.3.1"}
  ],
  "cves": [
    {"id": "CVE-2023-39320", "cvss": 9.8, "severity": "CRITICAL"}
  ]
}

GET /api/v2/domains

List all domains in your account with their latest risk scores and checks.

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/domains

Add a domain to your account and queue a background scan.

POST /api/v2/domains Bearer
FieldTypeDescription
domainstringDomain to add, e.g. "mycompany.cz"
countrystringISO country code (optional — auto-detected from TLD)
{
  "id": "uuid",
  "domain": "mycompany.cz",
  "status": "scanning",
  "message": "Domain added — scan starting now"
}

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

Retrieve the latest full scan report for a domain. Free users see a subset; paid users see all 23 checks including nuclei active CVE validation and AI summary.

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",
  "auth_scanned_at": "2026-04-08T11:00:00Z",
  "auth_scan": { /* authenticated scan result object, null if not run */ },
  "checks": [
    {
      "check": "ssrf",
      "status": "info",
      "confidence": "informational",
      "title": "A10: 3 SSRF surface indicator(s)",
      "detail": "Surface area detected (not confirmed vulnerabilities)…",
      "score_impact": 0
    }
  ]
}

Each check object now includes a confidence field: "confirmed" (scored) or "informational" (zero penalty, surface indicator only). Informational findings are never counted in warnings or critical.

GET /domains/{domain_id}/verify-token

Return the domain ownership verification token for the authenticated user. Use one of the three provided methods to publish the token, then call POST /verify to confirm.

GET /domains/{domain_id}/verify-token Bearer
{
  "domain": "example.com",
  "token": "a3f7b2c1d4e5f6a7b8c9d0e1f2a3b4c5",
  "verified_at": null,
  "methods": {
    "dns_txt":   { "value": "swarmhawk-verify=a3f7b2c1…" },
    "well_known":{ "url": "https://example.com/.well-known/swarmhawk-verify.txt" },
    "meta_tag":  { "tag": "<meta name=\"swarmhawk-verify\" content=\"a3f7b2c1…\">" }
  }
}

POST /domains/{domain_id}/verify

Check whether the domain ownership token is present via DNS TXT record, /.well-known/swarmhawk-verify.txt file, or HTML <meta> tag. On success, verified_at is written to the domain and returned in all subsequent report responses.

POST /domains/{domain_id}/verify Bearer · no request body

Success response:

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

Not yet found response:

{ "verified": false, "message": "Verification token not found via DNS TXT, .well-known file, or HTML meta tag" }

POST /domains/{domain_id}/scan/authenticated

Run a targeted scan using a real session cookie. Detects cookie security flag gaps (HttpOnly/Secure/SameSite), authenticated page header issues (Cache-Control, clickjacking), and IDOR surface at common API paths. Runs in the background — results are stored in scans.auth_scan and returned in the domain report's auth_scan field.

POST /domains/{domain_id}/scan/authenticated Bearer

Request body:

{
  "cookie":     "sessionid=abc123; csrftoken=xyz456",
  "user_agent": "Mozilla/5.0 …"  // optional
}

Immediate response:

{ "status": "scanning", "message": "Authenticated scan started for example.com" }

Poll GET /domains/{id}/report after ~30s — the auth_scan field will be populated with findings.

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

Risk score trend over time — useful for building dashboards or alerting on score increases.

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

Map scan findings to NIS2 Directive articles. Returns a compliance score and per-article status — suitable as audit evidence for regulators.

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

Generate an AI-powered threat briefing for your domain portfolio using Claude. Returns a structured briefing with executive summary, critical findings, and remediation priorities.

POST /intel Bearer
FieldTypeDescription
domainsstringComma-separated: "example.com (risk:42), other.cz (risk:18)"
datestringToday's date, e.g. "10 March 2025"
{
  "text": "## Executive Summary\n\nYour domain portfolio shows...",
  "briefing": "…"
}

POST /api/v2/keys

Create a new API key for your account. Returns all keys including the new one.

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

List all API keys and their usage for the current month.

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

DELETE /api/v2/keys/{key}

Revoke an API key immediately. All future requests with this key will be rejected.

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

MCP Server

SwarmHawk exposes a Model Context Protocol server, letting any MCP-compatible AI assistant (Claude, Cursor, Windsurf) call SwarmHawk tools directly from conversation.

MCP URL https://swarmhawk.com/api/mcp

Claude Desktop config

{
  "mcpServers": {
    "swarmhawk": {
      "url": "https://swarmhawk.com/api/mcp",
      "headers": { "X-API-Key": "swh_your_key" }
    }
  }
}

Cursor / Windsurf config

{
  "mcpServers": {
    "swarmhawk": {
      "url": "https://swarmhawk.com/api/mcp",
      "headers": { "X-API-Key": "swh_your_key" }
    }
  }
}
💡 Once connected, just ask your AI: "Scan example.com for security issues" — it will call SwarmHawk automatically.

MCP Tools

ToolDescription~Time
scan_domain(domain)Full 22-check scan with risk score and all findings~30s
quick_risk_score(domain)Fast risk score without full scan detail~3s
check_typosquats(domain)Find registered lookalike/typosquat domains~5s
check_breach_exposure(domain)Check HaveIBeenPwned (12B+ accounts)~3s
check_reputation(domain)VirusTotal + Spamhaus + Google Safe Browsing~8s
batch_risk_scores(domains[])Score multiple domains in one call~10s
get_quota()Check remaining API calls for this monthinstant

Python SDK

The SwarmHawk Python SDK gives security platforms a clean programmatic interface to pull findings, configure push integrations, and consume STIX 2.1 bundles — no raw HTTP required.

# 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")

SDK Methods

MethodDescriptionReturns
domains(min_risk, country, limit, offset)Paginated scan resultslist[dict]
domain(name)Single domain full detaildict
alerts(min_risk, since, limit)High-risk findings, optional since datetimelist[dict]
iter_alerts(min_risk, page_size)Generator — auto-paginates through all resultsIterator[dict]
stix_bundle(min_risk, limit)STIX 2.1 bundle from /taxii endpointdict
integrations()List configured push integrationslist[dict]
configure_integration(service, config)Save integration credentialsdict
test_integration(service, config)Test connectivity without saving{ok, message}

Integration API

Configure push integrations so SwarmHawk automatically sends critical findings to your security platforms the moment they're detected (risk ≥ 70).

GET /integrations

List all configured integrations for the authenticated user. Secrets are masked.

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

POST /integrations/{service}

Save or update integration config. service is one of: 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://swarmhawk.com/api/integrations/splunk

POST /integrations/{service}/test

Test connectivity without saving. Returns {"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://swarmhawk.com/api/integrations/webhook/test

DEL /integrations/{service}

Remove an integration config.

Supported services

ServiceAuth methodTriggerPayload type
splunkHEC tokenrisk ≥ 70CIM-aligned JSON event
sentinelWorkspace SharedKey HMACrisk ≥ 70Flat KQL-ready fields (_s/_d/_b)
crowdstrikeOAuth2 client credentialsrisk ≥ 70IOC (type=domain, action=detect/prevent)
gravityzoneBearer access keyrisk ≥ 70JSON-RPC createCustomRule
cortexSHA-256 HMAC (api_key_id/nonce/ts)risk ≥ 70External alert with MITRE tags
jiraBasic (email:api_token)risk ≥ 70 AND cvss ≥ 7ADF-formatted issue with CVE/software tables
servicenowBasic (user:password)risk ≥ 70Incident with urgency/impact/SLA mapping
webhookOptional HMAC-SHA256 signaturerisk ≥ 70Enriched JSON payload
stixBearer (read via /taxii)Pull-basedSTIX 2.1 DomainName + Vulnerability objects

STIX / TAXII 2.1

SwarmHawk exposes a TAXII 2.1-compliant endpoint. Connect any threat intelligence platform (OpenCTI, MISP, ThreatConnect, Anomali) to pull SwarmHawk findings as STIX 2.1 objects.

GET /taxii/collections/

TAXII discovery endpoint — returns collection metadata.

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

GET /taxii/collections/swarmhawk/objects/

Returns a STIX 2.1 bundle of your high-risk domains as domain-name, vulnerability, and relationship objects.

curl "https://swarmhawk.com/api/taxii/collections/swarmhawk/objects/?min_risk=70&limit=200" \ -H "Authorization: Bearer swh_..."
ParamDefaultDescription
min_risk70Minimum risk score (0–100)
limit100Max objects (1–500)

STIX object types returned

TypeContent
domain-nameDomain value, risk score, priority, country
vulnerabilityCVE ID, CVSS score, description
relationshipdomain-name → related-to → vulnerability

All object IDs are deterministic (UUID5) — the same domain always produces the same STIX ID across bundle generations, enabling proper deduplication in downstream TIPs.

Real-Time Alerts — SSE

Subscribe to a live stream of new high-risk findings as they're detected. Uses standard Server-Sent Events (no WebSocket library needed).

GET /stream/alerts

curl -N \ -H "Authorization: Bearer swh_..." \ "https://swarmhawk.com/api/stream/alerts?min_risk=80" # Stream output: data: {"type":"connected","min_risk":80} data: {"type":"alert","domain":"evil-phishing.com","risk_score":97,"priority":"CRITICAL","max_cvss":9.8,"kev_cves":[...],"epss_max":0.92,"timestamp":"2026-03-31T14:22:01Z"} data: {"type":"heartbeat"}
// JavaScript client const es = new EventSource( 'https://swarmhawk.com/api/stream/alerts?min_risk=80&token=swh_...' ); es.onmessage = e => { const ev = JSON.parse(e.data); if (ev.type === 'alert') showToast(`🚨 ${ev.domain} — risk ${ev.risk_score}`); };
FieldTypeDescription
typestringalert | heartbeat | connected
domainstringNewly detected high-risk domain
risk_scoreinteger0–100
prioritystringCRITICAL / HIGH / MEDIUM
max_cvssfloatHighest CVSS among detected CVEs
kev_cvesarrayCVEs in CISA KEV (actively exploited)
epss_maxfloatHighest exploit probability (0–1)
timestampISO 8601Detection timestamp

Adapter Scripts

Standalone Python scripts for platforms where you prefer a scheduled pull (cron / Lambda / Azure Function) over the always-on push connector. Each script fetches SwarmHawk alerts and pushes them into the target platform in one run.

All adapters require only pip install httpx and accept both CLI flags and environment variables.
PlatformScriptMin risk defaultDownload
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
🐙 All scripts are also available in the swarmhawk GitHub repo under sdk/adapters/.

Splunk TA Adapter

# 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
FlagEnv varDescription
--api-keySWARMHAWK_API_KEYSwarmHawk API key
--min-riskSWARMHAWK_MIN_RISKMinimum risk score (default: 70)
--base-urlSWARMHAWK_BASE_URLAPI base URL
--indexSWARMHAWK_SPLUNK_INDEXSplunk index name (default: main)

Emits sourcetype=swarmhawk:scan events with CIM-aligned fields: dest, vendor_product, category, severity.

Microsoft Sentinel Adapter

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>
FlagEnv varDescription
--workspace-idAZURE_WORKSPACE_IDLog Analytics workspace ID
--shared-keyAZURE_SHARED_KEYPrimary or secondary shared key
--log-typeAZURE_LOG_TYPECustom table name (default: SwarmHawk)
--min-riskSWARMHAWK_MIN_RISKMinimum risk score (default: 70)

Data lands in SwarmHawk_CL custom table. KQL example: SwarmHawk_CL | where RiskScore_d >= 80 | sort by TimeGenerated desc

CrowdStrike Falcon Adapter

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>
FlagEnv varDescription
--cs-client-idCS_CLIENT_IDFalcon API client ID
--cs-client-secretCS_CLIENT_SECRETFalcon API client secret
--cs-base-urlCS_BASE_URLFalcon base URL (default: api.crowdstrike.com)
--min-riskSWARMHAWK_MIN_RISKMinimum risk score (default: 80)

Pushes domains as IOCs (type=domain) in batches of 200. Action is prevent for confirmed malware/phishing, detect for CVE exposure.

Bitdefender GravityZone Adapter

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>
FlagEnv varDescription
--gz-api-urlGZ_API_URLGravityZone JSON-RPC endpoint
--gz-access-keyGZ_ACCESS_KEYGravityZone API access key
--gz-company-idGZ_COMPANY_IDCompany/tenant ID
--min-riskSWARMHAWK_MIN_RISKMinimum risk score (default: 80)

Creates custom network rules via createCustomRule. Action is block for malware/phishing, report for CVE exposure.

Palo Alto Cortex XDR Adapter

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
FlagEnv varDescription
--xdr-api-keyXDR_API_KEYCortex XDR API key
--xdr-api-key-idXDR_API_KEY_IDAPI key numeric ID
--xdr-fqdnXDR_FQDNYour tenant FQDN (without https://api-)
--min-riskSWARMHAWK_MIN_RISKMinimum risk score (default: 75)

Sends external alerts with MITRE ATT&CK technique tags (T1566, T1190, T1046, T1557…). Batches of 100 per API call.

Jira Adapter

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 you@company.com \ --jira-token <API_TOKEN> \ --jira-project SEC
FlagEnv varDescription
--jira-base-urlJIRA_BASE_URLAtlassian Cloud URL
--jira-emailJIRA_EMAILAtlassian account email
--jira-tokenJIRA_TOKENAtlassian API token (id.atlassian.com → Security)
--jira-projectJIRA_PROJECTProject key (default: SEC)
--jira-issue-typeJIRA_ISSUE_TYPEIssue type (default: Bug)
--min-cvssSWARMHAWK_MIN_CVSSMinimum CVSS to create ticket (default: 7.0)

Creates structured ADF issues with risk summary table, CVE findings, software stack, failed checks, remediation bullets, and NIS2 label. Only fires when risk ≥ 70 AND cvss ≥ min_cvss to avoid ticket spam.

ServiceNow Adapter

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>
FlagEnv varDescription
--snow-instanceSNOW_INSTANCEServiceNow instance subdomain (no .service-now.com)
--snow-userSNOW_USERServiceNow username
--snow-passwordSNOW_PASSWORDServiceNow password
--snow-tableSNOW_TABLETarget table (default: incident)
--min-riskSWARMHAWK_MIN_RISKMinimum risk score (default: 70)
PriorityUrgencyImpactSLA target
CRITICAL114 hours
HIGH1224 hours
MEDIUM227 days
LOW / INFO3330 days

Response Objects

Check object

FieldTypeDescription
checkstringCheck identifier (see Check Names below)
statusstringok · warning · critical · locked
titlestringOne-line human-readable finding
detailstringFull explanation with evidence
score_impactnumberPoints added to risk score (0–40)

Risk score interpretation

ScoreLevelMeaning
0 – 29LOW RISKGood security posture, minor issues
30 – 59MEDIUM RISKNotable issues requiring attention
60 – 100HIGH RISKCritical findings, immediate action needed

Check Names

checkDescription
sslSSL/TLS validity, expiry, certificate chain
dnsDNS configuration — SPF, DMARC, DKIM, MX
headersHTTP security headers (CSP, HSTS, X-Frame-Options…)
breachHaveIBeenPwned breach exposure
virustotalVirusTotal (94 AV engines)
safebrowsingGoogle Safe Browsing
spamhausSpamhaus Domain Block List
urlhausURLhaus malicious URL database
shodanShodan — open ports and exposed services
whoisWHOIS / RDAP — domain age and registrant
cveCVE lookup via NVD for detected software
nucleiActive CVE validation via 3,000+ nuclei templates — confirmed exploit-path probing, not version inference. Returns nuclei_findings[] with matched URLs and CVSS scores.
typosquatsRegistered lookalike domain detection
sastStatic analysis exposure indicators
scaSoftware composition analysis
dastDynamic application security testing probes
iacInfrastructure-as-code security check
email_securityEmail authentication and relay configuration
dnssecDNSSEC validation
subdomain_takeoverDangling subdomain / takeover risk
open_portsUnexpected open port exposure
mxMail exchange record analysis
ai_summaryAI-generated threat analysis (paid only)
Ready to start building?

Get your free API key at www.swarmhawk.com → Sign In → Account → API Keys

Get Free API Key →
Interactive Explorer

Try It Live

Full interactive API explorer — execute real requests against the SwarmHawk API directly from your browser. Paste your API key into the Authorize button to unlock authenticated endpoints.

Schema source: https://swarmhawk.com/api/openapi.json