← Wróć
SwarmHawk 0.10 · REST API

API SwarmHawk

API SwarmHawk zapewnia programowy dostęp do 27 zautomatyzowanych kontroli bezpieczeństwa oraz 3000+ aktywnych szablonów nuclei CVE — SSL, DNS, CVE z potwierdzeniem aktywnego exploita, ekspozycja naruszeń danych, typosquatting, analiza zagrożeń AI i więcej — dla dowolnej domeny. Użyj go do budowania workflow'ów bezpieczeństwa, automatyzacji due diligence lub integracji SwarmHawk z własną platformą.

Istnieją dwie powierzchnie API:

  • /api/v2 — starsze powierzchnia uwierzytelniana sesją/JWT używana przez dashboard. Większość operacji odczytu i zapisu jest również dostępna tutaj dla kompatybilności.
  • /api/v1 — nowoczesny publiczny interfejs API Business / Enterprise, zabezpieczony kluczami API nośnika (swh_…). To jest cel, na który powinny być skierowane nowe integracje.
Podstawowy adres URL https://api.swarmhawk.com
📘 Wszystkie odpowiedzi to JSON. Wszystkie żądania z treścią muszą ustawić Content-Type: application/json.

Szybki start — skanuj domenę w 30 sekund

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

Uwierzytelnianie

SwarmHawk wykorzystuje dwie metody uwierzytelniania w zależności od punktu końcowego:

MetodaNagłówekUżywane do
Klucz API (Bearer)Authorization: Bearer swh_…/api/v1/* publiczne API Business / Enterprise
JWT sesjiAuthorization: Bearer <jwt>/api/v2/* i punkty końcowe panelu (z uwierzytelnieniem użytkownika)
Brak—/public-scan, /health
🔑 Uzyskaj swój klucz API na www.swarmhawk.com → Zaloguj się → Konto → Klucze API. Klucze API są dostępne w planach Business i Enterprise.

Format klucza API

swh_3f8a2b1c4d5e6f7a8b9c0d1e2f3a4b5c

Błędy i limity szybkości

Kody stanu HTTP

KodZnaczenie
200Sukces
400Błędne żądanie — sprawdź treść swojego żądania
401Brakujący lub nieprawidłowy klucz API / token sesji
403Forbidden — funkcja wymaga planu płatnego
429Przekroczono limit szybkości żądań
500Błąd serwera — spróbuj ponownie za 30 sekund

Struktura odpowiedzi błędu

{
  "detail": "Invalid API key"
}

Limity szybkości

PlanLimit
FreeKlucze API niedostępne; użyj panelu sterowania lub /public-scan
BusinessDomyślny limit na konto z możliwością doładowania portfela dla dodatkowych kredytów
EnterpriseLimity niestandardowe negocjowane dla każdej umowy
/public-scanBrak wymaganego klucza · ograniczane przez IP

Skanuj domenę

Nie istnieje jeden "skanowanie jednorazowe" endpoint. Aby skanować domenę za pośrednictwem API:

  1. Dodaj (i zweryfikuj) domenę za pomocą POST /api/v1/domains — pierwsza skanowanie jest automatycznie kolejkowane.
  2. Aby ponownie przeskanować już dodaną domenę, wywołaj POST /api/v1/domains/{domain_id}/scan.
  3. Odpytuj GET /api/v1/jobs/{job_id} w celu sprawdzenia statusu oraz GET /api/v2/domains/{domain_id}/report aby uzyskać najnowsze wyniki.
  4. W przypadku jednorazowych anonimowych skanów bez konta użyj POST /public-scan (ograniczone szybkością, wyniki nie są przechowywane).
Zapoznaj się z sekcjami Dodaj domenę, Rozpocznij skan i Status zadania w dokumentacji Business / Enterprise API, aby zapoznać się z kanoniczną strukturą żądań.

POST /public-scan

Anonimowe skanowanie — nie jest wymagany klucz API. Zwraca podzbiór kontroli z niektórymi wynikami zablokowanymi. Użyj tego do demonstracji lub osadzania. Wyniki nie są zapisywane.

POST /public-scan No auth
PoleTypOpis
domainstringDomena do skanowania
{
  "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

Szybkie skanowanie pasywne — wykrywa stos oprogramowania i sprawdza znane CVE bez pełnego skanowania. Odpowiedź w ~3 sekundy. Wynik nie jest zapisywany.

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"
}

priority: CRITICAL (cvss ≥ 9) · HIGH (≥ 7) · MEDIUM (≥ 4) · LOW. Jeśli flota skanerów upstream jest niedostępna, endpoint zwraca pusty kształt wyniku zamiast odpowiedzi 5xx.

GET /api/v2/domains

Wyświetl listę wszystkich domen na Twoim koncie wraz z najnowszymi wynikami ryzyka i kontrolami.

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

Dodaj domenę do swojego konta i umieść skan w kolejce.

POST /api/v2/domains Bearer
PoleTypOpis
domainstringDomena do dodania, np. "mycompany.cz"
countrystringKod kraju ISO (opcjonalnie — automatycznie wykrywany z TLD)
{
  "id": "uuid",
  "domain": "mycompany.cz",
  "status": "scanning",
  "message": "Domain added — scan starting now"
}

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

Pobierz najnowszy pełny raport skanowania dla domeny. Użytkownicy darmowi widzą podzbiór; użytkownicy premium widzą wszystkie 27 kontroli, w tym walidację aktywnych CVE nuclei i podsumowanie AI.

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
    }
  ]
}

Każdy obiekt kontroli zawiera teraz pole confidence: "confirmed" (oceniane) lub "informational" (bez kar, tylko wskaźnik powierzchniowy). Ustalenia informacyjne nigdy nie są zliczane w warnings ani critical.

GET /domains/{domain_id}/verify-token

Zwróć aktywne wyzwanie weryfikacji wydane przez koordynatora weryfikacji. SwarmHawk obsługuje dwie metody weryfikacji — rekord DNS TXT lub przesyłanie pliku HTTP. Wywołaj POST /domains/{domain_id}/verify z method: "dns" lub "http" po opublikowaniu rekordu/pliku.

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."
    }
  ]
}

Wpis metody HTTP pojawia się tylko wtedy, gdy orchestrator wydał wyzwanie http_path. Jeśli orchestrator jest niedostępny, endpoint zwraca 503 no_verification_orchestrator.

POST /domains/{domain_id}/verify

Poproś orkiestrator o potwierdzenie własności przy użyciu wybranej metody. W przypadku powodzenia wartość domains.verified_at zostaje zapisana i zwrócona w kolejnych odpowiedziach raportu. Orkiestrator buforuje pozytywne weryfikacje przez 7 dni.

POST /domains/{domain_id}/verify Bearer

Treść żądania (opcjonalnie, domyślnie dns):

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

Odpowiedź sukcesu:

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

Odpowiedź jeszcze nie znaleziona:

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

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

Trend wyniku ryzyka w czasie — przydatny do budowania dashboardów lub alertowania o wzroście wyniku.

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

Mapuj wyniki skanowania na artykuły Dyrektywy NIS2. Zwraca wynik zgodności i status dla każdego artykułu — odpowiedni jako dowód audytu dla organów regulacyjnych.

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

Generuj zasilany sztuczną inteligencją raport zagrożeń dla swojego portfela domen za pomocą Claude. Zwraca ustrukturyzowany raport zawierający streszczenie dla kierownictwa, krytyczne ustalenia i priorytety remediacji.

POST /intel Bearer
PoleTypOpis
domainsstringOddzielone przecinkami: "example.com (risk:42), other.cz (risk:18)"
datestringData dzisiejsza, np. "10 marca 2025"
{
  "text": "## Executive Summary\n\nYour domain portfolio shows...",
  "briefing": "…"
}

POST /api/v2/keys

Utwórz nowy klucz API dla swojego konta. Zwraca wszystkie klucze, włączając nowo utworzony.

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

Wyświetl listę wszystkich kluczy API i ich użycie w bieżącym miesiącu.

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

DELETE /api/v2/keys/{key}

Natychmiast odwołaj klucz API. Wszystkie przyszłe żądania z tym kluczem zostaną odrzucone.

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

Business / Enterprise API — /api/v1

Powierzchnia /api/v1/* to produkcyjny interfejs API zapisu używany przez klientów Business i Enterprise. Każdy endpoint poniżej akceptuje X-API-Key: swh_… (rekomendowane dla komunikacji serwer-do-serwera) lub Authorization: Bearer <jwt> (dla narzędzi first-party).

Podstawowy adres URL https://api.swarmhawk.com

Ograniczenia wersji

  • Bezpłatny — dostęp do API niedozwolony (403 API_ACCESS_REQUIRED).
  • Pro — 10-wywołań bezpłatny okres próbny tylko do odczytu. Endpoints zapisu zwracają 403 business_required.
  • Business — 500 wywołań/miesiąc, obciążenie portfela/uprawnień na skan/test penetracyjny/naruszenie.
  • Enterprise — nieograniczone zapytania; rejestracja przez administratora z limitem max_domains na klienta i pomiarem na zapytanie (szczegóły).

Typowy przepływ dla sprzedawcy

# 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

Wydaj klucz API dla bieżącego użytkownika. Business: jeden klucz, 500 wywołań/miesiąc. Enterprise: jeden klucz, nieograniczony (zarządzany przez administratora poprzez /admin/api/v1/enterprise/*). Tylko Bearer JWT — nie możesz bootstrapować swojego pierwszego klucza samym sobą; logowanie do panelu (lub rejestracja admin dla Enterprise) to punkt wejścia.

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

Wyświetl aktywne klucze + użycie w bieżącym miesiącu. Tekst jawny nigdy nie jest ponownie wyświetlany. Tylko Bearer JWT — punkty końcowe zarządzania kluczami nie są osiągalne za pomocą klucza 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

Odwołaj istniejący klucz i wydaj nowy. Nowy tekst jawny jest wyświetlany jednokrotnie w odpowiedzi — poprzedni klucz przestaje działać natychmiast. Tylko Bearer JWT.

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

DELETE /api/v1/keys/{key_id}

Odwołaj klucz. Idempotentne. Tylko Bearer JWT.

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

GET /api/v1/domains

Wyświetl domeny rozmówcy. Paginacja; obsługuje ?limit i ?offset.

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

POST /api/v1/domains

Dodaj domenę i atomowo uruchom weryfikację orkiestratora. Zwraca wyzwanie DNS-TXT w treści odpowiedzi, dzięki czemu możesz dostarczyć je swojemu klientowi bez konieczności dodatkowego kontaktu. Bezpłatnie dla klienta — dodanie domeny nie obciąża portfela.

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

Treść

PoleTypWymaganeOpis
domainstringyes4–253 znaki, małe litery.
countrystring—ISO 3166-1 alpha-2. Automatycznie pochodna z TLD jeśli brakuje.
industrystring—Etykieta o dowolnej treści do grupowania i raportowania.
primary_contactstring—Email do kierowania naruszeń bezpieczeństwa/alertów.

Odpowiedź (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"
  }
}

Błędy: 403 tier_locked przy limitach; 409 domain_already_added dla duplikatów; 422 invalid_domain.

GET /api/v1/domains/{domain_id}

Szczegóły pojedynczej domeny: risk_score, last_scanned_at, verified_at, country, itd. 404 przy niezgodności.

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

PATCH /api/v1/domains/{domain_id}

Przełącz auto_rescan_enabled dla domeny (jedyne pole modyfikowalne na tym endpoincie). Włączenie wymaga warstwy Pro lub wyższej (bramka funkcji daily_rescan); wyłączenie jest zawsze dozwolone. Aby zmienić industry, primary_contact lub country, usuń i ponownie dodaj domenę.

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}

Trwałe usunięcie domeny. Wiersz, jego stan weryfikacji i wszystkie powiązane rekordy zadań są usuwane. Zwalnia slot w limicie poziomu. Przywrócenie limitu przydziału +1.

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

POST /api/v1/domains/bulk-import

Wieloczęściowe przesłanie pliku CSV — każdy wiersz to domena,kraj (kraj jest obowiązkowy, kod ISO dwuliterowy). Pierwszy wiersz może być nagłówkiem domena,kraj — zostanie pominięty. Respektuje limit dla danego klienta; wiersze przekraczające limit trafiają na listę rejected z powodem quota exceeded. Limit +1 per call (nie per wiersz).

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

Zwraca {accepted: [...], rejected: [...]}. Dostępne w planach Business i Enterprise (funkcja: bulk_import).

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

Uporządkowana chronologicznie lista poprzednich skanów i zmian checksum dla domeny.

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

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

Pobieranie tylko do odczytu bieżącego stanu wyzwania authz z orkiestratora (DNS + ścieżka HTTP + wartości rekordów + czas wygaśnięcia). Użyj tego, jeśli potrzebujesz ponownie wyświetlić wyzwanie po utracie początkowej odpowiedzi POST /api/v1/domains.

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/domains/{domain_id}/verify

Poproś orkiestrator o rzeczywiste uruchomienie sprawdzenia. method=dns (domyślnie) wykonuje wyszukiwanie TXT; method=http pobiera https://<domena><http_path> i porównuje do 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"}

Przy verified:true, zarówno domains.verified_at jak i cache orkiestratora są przełączane — kolejne wywołania scan/pentest/breach już nie zwracają domain_unverified.

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

Prześlij skan powierzchni ataku do orkiestratora. Bez weryfikacji domeny — każda dodana domena jest uprawniona. Business: debetuje portfel/uprawnienia na podstawie service_prices.attack_surface. Enterprise: rejestruje wiersz usage_events z efektywną ceną na klienta, bez dotknięcia portfela. Przydział +1 na 201.

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

Odpowiedź (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
}

Błędy: 402 INSUFFICIENT_BALANCE, 403 enterprise_inactive, 429 cooldown (wymuszony przez orkiestrator wspólny okres 24h z testem penetracyjnym), 503 orchestrator_unavailable.

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

Prześlij test penetracyjny AI. Opcjonalny parametr rate_profile kontroluje agresywność skanowania: stealth (3 rps) · regular (10 rps, domyślnie) · aggressive (25 rps). Wszystkie pozostałe parametry pozostają zgodne z ustawieniami domyślnymi orkiestratora. Ta sama logika podziału portfela/mierzenia, co w przypadku /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":"…"}

Ta sama powierzchnia błędów co przy skanowaniu, plus 422 invalid_rate_profile.

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

Umieść w kolejce zadanie darknet-research, które przeprowadza weryfikację źródeł darknet pod kątem poświadczeń, haszy i danych osobowych powiązanych z tą domeną. Asynchroniczne — zwraca job_id natychmiast; odpytuj GET /api/v1/breach-intel/{job_id} w celu sprawdzenia statusu i wyników. Typowy czas realizacji end-to-end wynosi 30–90 s. Domena musi być zweryfikowana. Business: obciąża portfel/uprawnienia zgodnie z service_prices.breach_intel. Enterprise: rejestruje wiersz usage_events z efektywną ceną na klienta, bez dostępu do portfela. Limit +1 przy zaakceptowanym zgłoszeniu. Czas oczekiwania dla domeny: 7 dni (okno darknet orkiestratora).

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"
}

Błędy: 402 INSUFFICIENT_BALANCE, 403 domain_unverified, 403 enterprise_inactive, 409 already_running (zadanie jest już w trakcie dla tej domeny), 429 cooldown (lokalne okno 7 dni), 429 darknet_cooldown_active (okno 7 dni wymuszane przez orkiestrator z polem next_available_at), 502 orchestrator_unavailable, 503 orchestrator_unavailable.

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

Odpytuj zadanie darknet-research. Weryfikacja własności; brak limitu. Backend leniwie odpytuje orkiestrator (przepustnica 5 s), dopóki wiersz lokalny jest w stanie running, dlatego ten endpoint można wywoływać często bez przeciążania systemu upstream. Gdy zadanie osiągnie stan terminalny (completed | failed | cancelled), kolejne wywołania zwracają buforowany wiersz bez żadnej komunikacji z orkiestratorem.

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"
}

Po error = "no_data_available" lub "orchestrator_job_not_found" konsumpcja portfela/uprawnień jest automatycznie zwracana — nie wymaga to żadnych działań ze strony wywołującego.

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

Odszyfruj jedno hasło w postaci jawnej z wynaleziska darknet. Tylko właściciel (próby wielo-dzierżawcy zwracają 404 — obecność jest prywatna). Domena musi być nadal zweryfikowana przez orkiestrator w momencie wywołania. Tekst jawny zwracany jest bezpośrednio i NIGDY nie jest utrwalony w bazie danych SwarmHawk; każde wywołanie zapisuje jeden wiersz admin_audit_log. Brak kosztów limitów.

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"
}

Błędy: 403 domain_unverified (weryfikacja wygasła od czasu uruchomienia skanowania), 404 finding_not_found (id nie jest częścią tego zadania — również zwracane dla wielu dzierżawców), 502 orchestrator_reveal_failed. Tylko wyniki z has_password: true w odpowiedzi GET mogą być ujawnione.

GET /api/v1/jobs/{job_id}

Proxy statusu zadania do orkiestratora. job_id tutaj to identyfikator orkiestratora zwrócony przez POST /scan lub /pentest. Własność jest egzekwowana po stronie serwera — 404 przy niezgodności (existence-private). GET = bez limitów quota.

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.

Odpytuj co 5–10 sekund, gdy status to queued lub running. Po otrzymaniu done, pobierz wyniki / raport poniżej.

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

Ustrukturyzowana lista wyników (podatności, odsłonięte usługi, słabe konfiguracje itp.). Zwracana po 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

Pełny raport JSON (streszczenie dla kierownictwa + ustalenia + rekomendacje). Dostępny po 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

Ten sam raport renderowany jako PDF (strumień binarny z nagłówkiem Content-Disposition). Przeznaczony do bezpośredniego rozpowszechniania wśród Twoich użytkowników.

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.

Warstwa Enterprise

Warstwa Enterprise jest przeznaczona dla dostawców hostingu, MSSP-ów i innych reselllerów, którzy uruchamiają SwarmHawk jako białą etykietę API w imieniu wielu dzierżawców. Wymaga rejestracji przez administratora (bez możliwości samodzielnego zakupu) i negocjacji umowy — skontaktuj się z działem sprzedaży, aby rozpocząć onboarding.

Czym różni się od Business

  • Sztywny limit domen na klienta — umowa definiuje max_domains (np. 100, 500, 5000); (N+1)-te żądanie POST /api/v1/domains zwraca 403 tier_locked z feature:"domains" i treścią zawierającą limit/current.
  • Nieograniczone wywołania API — Twój klucz zawiera limit_per_month: null; miesięczny limit obowiązujący dla planów Pro/Business jest pomijany.
  • Pomiar na wywołanie — każde wywołanie scan, pentest i breach-intel jest rejestrowane w niezmiennym dzienniku usage_events z efektywną ceną na klienta, możliwą do pobrania za pośrednictwem GET /api/v1/usage. Ceny dla poszczególnych usług mogą być zastąpione kontraktowo przez administratora (w przeciwnym razie stosuje się globalny cennik).
  • Bez portfela / bez Stripe — Rozliczenia Enterprise odbywają się poza platformą w cyklu miesięcznych faktur. Saldo portfela Twojego resellera jest nieistotne.
  • Tylko API — Klienci Enterprise nie logują się do panelu. Dział sprzedaży przekazuje Ci klucz bearer poza kanałem; wszystko poniżej działa z X-API-Key: swh_….

Dostępne punkty końcowe

Klienci Enterprise wykorzystują istniejącą powierzchnię Business /api/v1/* oraz nowy endpoint GET /api/v1/usage:

  • POST /api/v1/keys, GET /api/v1/keys — wyświetlaj własne metadane klucza (sam klucz w postaci zwykłego tekstu jest wyświetlany tylko raz podczas rejestracji / regeneracji).
  • POST /api/v1/domains — z zastrzeżeniem limitu max_domains dla każdego klienta.
  • 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 — Tylko dla Enterprise (patrz poniżej).

GET /api/v1/usage

Zagregowane wykorzystanie na domenę dla klienta Enterprise w danym okresie rozliczeniowym. Użyj tego do uzgodnienia swojej faktury miesięcznej lub do rozliczenia swoich dzierżawców na domenę.

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

Parametry zapytania

NazwaTypDomyślnieOpis
periodstringbieżący miesiącFormat YYYY-MM. Przekłada się na [YYYY-MM-01, next-month-01) UTC. Nieprawidłowe wartości zwracają 400 invalid_period.

Przykład

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

Odpowiedź

{
  "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
  }
}

Uwagi

  • Tablica domains zawiera wyłącznie domeny z co najmniej jednym zdarzeniem w danym okresie. Domeny, którymi dysponujesz, ale których nie używałeś w tym miesiącu, są pomijane — w celu uzyskania pełnego inwentarza użyj zapytania GET /api/v1/domains.
  • Jeśli domena zostanie usunięta między zdarzeniem a zapytaniem, jej wiersz nadal pojawia się z domain_id: null i domain: "<deleted>" — ścieżka audytu jest zachowana.
  • Koszt odzwierciedla efektywną cenę za wywołanie w momencie zdarzenia: zastosowanie umowy per-klient, jeśli została ustawiona, w przeciwnym razie globalna stawka z karty cenowej usługi.
  • 403 enterprise_only jest zwracany dla każdego użytkownika spoza warstwy Enterprise, który uzyska dostęp do tego endpointu.

Zachowanie przy dezaktywacji

Jeśli Twoje konto Enterprise zostało wstrzymane przez administratora (brak płatności, koniec umowy itp.), każde wywołanie /api/v1/* — odczyt i zapis — zwraca:

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

Klucz API nie został odwołany (dlatego reaktywacja przywraca dostęp bez ponownego wydawania kluczy), a historyczne usage_events + domains są zachowane. Skontaktuj się z zespołem sprzedaży, aby reaktywować.

Python SDK

SwarmHawk Python SDK zapewnia platformom bezpieczeństwa czysty interfejs programistyczny do pobierania wyników, konfigurowania integracji push i konsumowania wiązek STIX 2.1 — bez konieczności bezpośredniego dostępu do HTTP.

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

Metody SDK

MetodaOpisZwraca
domains(min_risk, country, limit, offset)Wyniki skanowania z podziałem na stronylist[dict]
domain(name)Single domain full detaildict
alerts(min_risk, since, limit)Wyniki wysokiego ryzyka, opcjonalnie od datetimelist[dict]
iter_alerts(min_risk, page_size)Generator — automatycznie paginuje wszystkie wynikiIterator[dict]
stix_bundle(min_risk, limit)Pakiet STIX 2.1 z punktu końcowego /taxiidict
integrations()Wyświetl skonfigurowane integracje pushlist[dict]
configure_integration(service, config)Zapisz poświadczenia integracjidict
test_integration(service, config)Testuj łączność bez zapisywania{ok, message}

API Integracji

⚠ Integracje są obecnie chronione flagą funkcji. Z INTEGRATIONS_ENABLED=false (domyślna konfiguracja platformy), każdy punkt końcowy /integrations* zwraca HTTP 410 { "error": "feature_disabled" }. Skontaktuj się z [email protected], jeśli potrzebujesz reaktywacji tej funkcji na swoim koncie.

Po włączeniu skonfiguruj integracje push, aby SwarmHawk automatycznie wysyłał krytyczne odkrycia do Twoich platform bezpieczeństwa w momencie ich wykrycia (ryzyko ≥ 70).

GET /integracje

Wyświetl wszystkie skonfigurowane integracje dla uwierzytelnionego użytkownika. Sekrety są maskowane.

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

POST /integracje/{service}

Zapisz lub zaktualizuj konfigurację integracji. service to jeden z: 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 /integracje/{service}/test

Przetestuj łączność bez zapisywania. Zwraca {"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 /integracje/{service}

Usuń konfigurację integracji.

Obsługiwane usługi

UsługaMetoda uwierzytelnianiaWyzwalaczTyp ładunku
splunkToken HECryzyko ≥ 70Zdarzenie JSON zgodne ze standardem CIM
sentinelKlucz wspólny obszaru roboczego HMACryzyko ≥ 70Płaskie pola gotowe do KQL (_s/_d/_b)
crowdstrikePoświadczenia klienta OAuth2ryzyko ≥ 70IOC (type=domena, action=detect/prevent)
gravityzoneKlucz dostępu Bearerryzyko ≥ 70JSON-RPC createCustomRule
cortexSHA-256 HMAC (api_key_id/nonce/ts)ryzyko ≥ 70Alert zewnętrzny ze znacznikami MITRE
jiraPodstawowa (email:api_token)ryzyko ≥ 70 AND cvss ≥ 7Problem w formacie ADF z tabelami CVE/oprogramowania
servicenowPodstawowe (użytkownik:hasło)ryzyko ≥ 70Zdarzenie z mapowaniem pilności/wpływu/SLA
webhookOpcjonalna sygnatura HMAC-SHA256ryzyko ≥ 70Wzbogacona ładunek JSON
stixBearer (odczyt via /taxii)Oparte na pobieraniuSTIX 2.1 DomainName + obiekty Vulnerability

STIX / TAXII 2.1

SwarmHawk udostępnia punkt końcowy zgodny ze standardem TAXII 2.1. Połącz dowolną platformę threat intelligence (OpenCTI, MISP, ThreatConnect, Anomali), aby pobierać ustalenia SwarmHawk jako obiekty STIX 2.1.

GET /taxii/collections/

Punkt odkrywania TAXII — zwraca metadane kolekcji.

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

GET /taxii/collections/swarmhawk/objects/

Zwraca pakiet STIX 2.1 Twoich domen wysokiego ryzyka jako obiekty domain-name, vulnerability i relationship.

curl "https://api.swarmhawk.com/taxii/collections/swarmhawk/objects/?min_risk=70&limit=200" \ -H "Authorization: Bearer swh_..."
ParametrDomyślnieOpis
min_risk70Minimalny wynik ryzyka (0–100)
limit100Maksymalna liczba obiektów (1–500)

Zwrócone typy obiektów STIX

TypZawartość
domain-nameWartość domeny, wynik ryzyka, priorytet, kraj
vulnerabilityIdentyfikator CVE, wynik CVSS, opis
relationshipnazwa-domeny → powiązana-z → podatność

Wszystkie identyfikatory obiektów są deterministyczne (UUID5) — ta sama domena zawsze generuje ten sam identyfikator STIX we wszystkich generacjach pakietów, umożliwiając prawidłową deduplikację w downstream TIP.

Skrypty adapterów

Autonomiczne skrypty Python dla platform, w których preferujesz zaplanowane pobieranie (cron / Lambda / Azure Function) zamiast zawsze aktywnego connectora push. Każdy skrypt pobiera alerty SwarmHawk i przesyła je do platformy docelowej w jednym uruchomieniu.

Wszystkie adaptery wymagają jedynie pip install httpx i akceptują zarówno flagi CLI, jak i zmienne środowiskowe.
PlatformaSkryptDomyślne minimum ryzykaPobierz
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
🐙 Wszystkie skrypty są również dostępne w repozytorium SwarmHawk na GitHub w katalogu sdk/adapters/.

Adapter 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
FlagaZmienna środowiskowaOpis
--api-keySWARMHAWK_API_KEYKlucz API SwarmHawk
--min-riskSWARMHAWK_MIN_RISKMinimalna ocena ryzyka (domyślnie: 70)
--base-urlSWARMHAWK_BASE_URLPodstawowy URL API
--indexSWARMHAWK_SPLUNK_INDEXNazwa indeksu Splunk (domyślnie: main)

Emituje zdarzenia sourcetype=swarmhawk:scan z polami zgodными z CIM: dest, vendor_product, category, severity.

Adapter 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>
FlagaZmienna środowiskowaOpis
--workspace-idAZURE_WORKSPACE_IDIdentyfikator obszaru roboczego Log Analytics
--shared-keyAZURE_SHARED_KEYKlucz współdzielony główny lub pomocniczy
--log-typeAZURE_LOG_TYPENiestandardowa nazwa tabeli (domyślnie: SwarmHawk)
--min-riskSWARMHAWK_MIN_RISKMinimalny wynik ryzyka (domyślnie: 70)

Dane trafiają do tabeli niestandardowej SwarmHawk_CL. Przykład KQL: SwarmHawk_CL | where RiskScore_d >= 80 | sort by TimeGenerated desc

Adapter 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>
FlagaZmienna środowiskowaOpis
--cs-client-idCS_CLIENT_IDIdentyfikator klienta API Falcon
--cs-client-secretCS_CLIENT_SECRETTajny klucz klienta Falcon API
--cs-base-urlCS_BASE_URLPodstawowy adres URL Falcon (domyślnie: api.crowdstrike.com)
--min-riskSWARMHAWK_MIN_RISKMinimalny wynik ryzyka (domyślnie: 80)

Wysyła domeny jako IOC (type=domain) w partiach po 200. Akcja to prevent dla potwierdzonych złośliwych oprogramowań/phishingu, detect dla ekspozycji CVE.

Adapter 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>
FlagaZmienna środowiskowaOpis
--gz-api-urlGZ_API_URLPunkt końcowy GravityZone JSON-RPC
--gz-access-keyGZ_ACCESS_KEYKlucz dostępu API GravityZone
--gz-company-idGZ_COMPANY_IDID firmy/dzierżawcy
--min-riskSWARMHAWK_MIN_RISKMinimalny wynik ryzyka (domyślnie: 80)

Tworzy niestandardowe reguły sieci za pośrednictwem createCustomRule. Akcja to block dla złośliwego oprogramowania/phishingu, report dla ekspozycji CVE.

Adapter 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
FlagaZmienna środowiskowaOpis
--xdr-api-keyXDR_API_KEYKlucz API Cortex XDR
--xdr-api-key-idXDR_API_KEY_IDNumeryczny identyfikator klucza API
--xdr-fqdnXDR_FQDNFQDN Twojej dzierżawy (bez https://api-)
--min-riskSWARMHAWK_MIN_RISKMinimalna ocena ryzyka (domyślnie: 75)

Wysyła zewnętrzne alerty ze znacznikami technik MITRE ATT&CK (T1566, T1190, T1046, T1557…). Partie po 100 na wywołanie API.

Adapter 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
FlagaZmienna środowiskowaOpis
--jira-base-urlJIRA_BASE_URLURL Atlassian Cloud
--jira-emailJIRA_EMAILEmail konta Atlassian
--jira-tokenJIRA_TOKENToken API Atlassian (id.atlassian.com → Security)
--jira-projectJIRA_PROJECTKlucz projektu (domyślnie: SEC)
--jira-issue-typeJIRA_ISSUE_TYPETyp problemu (domyślnie: Błąd)
--min-cvssSWARMHAWK_MIN_CVSSMinimalna wartość CVSS do utworzenia zgłoszenia (domyślnie: 7.0)

Tworzy uporządkowane problemy ADF ze streszczeniem ryzyka, tabelą wyników CVE, stosem oprogramowania, nieudanymi kontrolami, punktami naprawczymi oraz etykietą NIS2. Uruchamia się tylko, gdy ryzyko ≥ 70 I cvss ≥ min_cvss, aby uniknąć spamu zgłoszeń.

Adapter 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>
FlagaZmienna środowiskowaOpis
--snow-instanceSNOW_INSTANCEPoddomena instancji ServiceNow (bez .service-now.com)
--snow-userSNOW_USERNazwa użytkownika ServiceNow
--snow-passwordSNOW_PASSWORDHasło ServiceNow
--snow-tableSNOW_TABLETabela docelowa (domyślnie: incident)
--min-riskSWARMHAWK_MIN_RISKMinimalny wynik ryzyka (domyślnie: 70)
PriorytetPilnośćWpływcel SLA
CRITICAL114 godziny
HIGH1224 godziny
MEDIUM227 dni
LOW / INFO3330 dni

Obiekty Odpowiedzi

Sprawdzenie obiektu

PoleTypOpis
checkstringIdentyfikator kontroli (patrz Nazwy kontroli poniżej)
statusstringok · warning · critical · locked
titlestringJednowierszowy opis ustalenia dla użytkownika
detailstringPełne wyjaśnienie z dowodami
score_impactnumberPunkty dodane do wyniku ryzyka (0–40)

Interpretacja wyniku ryzyka

WynikPoziomZnaczenie
0 – 29NISKIE RYZYKODobra postawa bezpieczeństwa, drobne problemy
30 – 59RYZYKO ŚREDNIEWażne problemy wymagające uwagi
60 – 100WYSOKIE RYZYKOKrytyczne ustalenia, wymagane natychmiastowe działanie

Weryfikacja Nazw

Każdy wpis w tablicy checks[] raportu skanowania zawiera identyfikator check. Pełna lista identyfikatorów emitowanych przez skaner dzisiaj (źródło: backend/scanhawk_translator.py + backend/post_scan_processor.py):

sprawdzenieGrupaOpis
tls_protocolTLSNegocjowana wersja TLS (flagi TLS < 1.2)
tls_cipherTLSSłabe zestawy szyfrów
tls_cert_expiryTLSWygaśnięcie certyfikatu / już wygasły
tls_self_signedTLSCertyfikat podpisany samodzielnie
tls_handshakeTLSBłędy uzgadniania TLS
email_dmarcEmailDMARC brakuje lub jest słaby (p=none)
mx_blacklistEmailHost MX na publicznej liście blokowania
blacklistReputationDomena lub rekord A na publicznej czarnej liście (Spamhaus / URLhaus / Safe Browsing)
ip_reputationReputationSygnały reputacji IP hostingu / geo / ASN
cve_matchVulnsOdcisk oprogramowania dopasowany do znanych CVE (CVSS + KEV + EPSS)
exposed_gitExposurePubliczny katalog /.git/
exposed_envExposurePubliczny plik .env
mixed_contentWebStrona HTTPS ładuje zasoby HTTP
sri_missingWebBrakuje integralności zasobów podrzędnych w skryptach stron trzecich
cookies_secureWebCiasteczka bez flag Secure / HttpOnly / SameSite
takeover_riskDNSSubdomena pozostała / kandydat do przejęcia
security_txtHygieneBrakuje /.well-known/security.txt (RFC 9116)
whois_privacyHygieneOchrona prywatności WHOIS włączona / wyłączona
ai_summaryReportingAnaliza zagrożeń generowana przez AI (tylko dla użytkowników płatnych)

Szczegółowe kontrole (np. tls_protocol, tls_cipher) są grupowane w szersze kategorie (TLS, DNS, Headers, itp.) na potrzeby wyświetlania na pulpicie nawigacyjnym. Raport PDF wykorzystuje dodatkowe etykiety przyjazne dla użytkownika (zobacz backend/main.py:CHECK_LABELS), ale identyfikatory JSON powyżej są kanoniczną powierzchnią ataku.

Gotowy do rozpoczęcia?

Uzyskaj bezpłatny klucz API na www.swarmhawk.com → Sign In → Account → API Keys

Uzyskaj bezpłatny klucz API →
Interaktywny Eksplorator

Spróbuj na Żywo

Pełny interaktywny eksplorator API — wykonuj rzeczywiste żądania bezpośrednio do API SwarmHawk z przeglądarki. Wklej klucz API w przycisk Authorize, aby odblokować uwierzytelnione punkty końcowe.

Źródło schematu: https://api.swarmhawk.com/openapi.json