CyboruxCyborux API
Domains

Domain Summary

Retrieve a dashboard summary for a domain, optimized for fast page load.

https://api.cyborux.com
GET/api/domain/{domain_name}/summary
Path Parameters
string
Authorizationheader
Bearer <token>

API key authentication — use your Cyborux API key as a Bearer token.

Path Parameters

ParameterTypeDescription
domain_namestringThe domain name (e.g. example.com).

Response

{
  "domain": "example.com",
  "last_analyzed": "2026-03-08T14:22:00Z",
  "status": "completed",
  "counts": {
    "emails": 134,
    "people": 18,
    "files": 9,
    "subdomains": 47,
    "usernames": 22,
    "related_domains": 5
  },
  "security_metrics": {
    "spoofable_emails": 12,
    "leaked_emails": 27,
    "active_subdomains": 38,
    "takeover_vulnerable": 2,
    "passwords_exposed": 5,
    "people_with_emails": 15,
    "people_in_files": 3,
    "critical_vulnerabilities": 1,
    "high_vulnerabilities": 4,
    "email_auth": {
      "schema_version": 1,
      "spoofing_protection": "partial",
      "reasons": [
        "DMARC policy is 'quarantine' — spoofed mail is delivered to spam, not rejected",
        "SPF uses soft fail (~all) instead of hard fail (-all)"
      ],
      "dmarc": {
        "policy": "quarantine",
        "pct": 100,
        "raw_record": "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com",
        "checked_at": "2026-04-26T12:34:56+00:00"
      },
      "spf": {
        "qualifier": "~all",
        "policy": "soft_fail",
        "raw_record": "v=spf1 include:_spf.google.com ~all",
        "checked_at": "2026-04-26T12:34:56+00:00"
      }
    },
    "breach_analytics": {
      "total_breaches": 27,
      "affected_emails": 18,
      "recent_affected_emails": 5,
      "total_emails": 134,
      "recent_pct": 64,
      "recent_window_years": 2,
      "yearly_counts": [
        { "year": 2017, "count": 0 },
        { "year": 2018, "count": 1 },
        { "year": 2019, "count": 2 },
        { "year": 2020, "count": 3 },
        { "year": 2021, "count": 5 },
        { "year": 2022, "count": 4 },
        { "year": 2023, "count": 6 },
        { "year": 2024, "count": 7 },
        { "year": 2025, "count": 5 },
        { "year": 2026, "count": 1 }
      ],
      "latest_breaches": [
        {
          "name": "LinkedIn",
          "title": "LinkedIn (2021)",
          "breach_date": "2021-06-22",
          "affected_count": 23,
          "pwn_count": 700000000
        }
      ]
    },
    "login_pages_count": 3,
    "usernames_in_files": 8,
    "usernames_attributed": 5,
    "avg_services_emails": 4.2,
    "posture": {
      "email-auth": "watch",
      "vulnerability": "at-risk",
      "credential-exposure": "watch",
      "attack-surface": "watch",
      "shadow-it": "good",
      "high-profile": "at-risk",
      "crypto-dns": "good"
    }
  },
  "posture_score": 34,
  "posture_trend": [
    { "captured_at": "2026-06-01T03:12:44Z", "score": 20 },
    { "captured_at": "2026-06-15T03:11:02Z", "score": 34 }
  ],
  "tls_grade": "A",
  "tls_scanned": true,
  "highlights": {
    "most_exposed_people": [],
    "interesting_subdomains": [],
    "interesting_files": []
  },
  "domain_info": {
    "registrar": "GoDaddy",
    "creation_date": "2010-05-15",
    "expiration_date": "2027-05-15",
    "whois_data": { "...": "raw WHOIS record (registrar fields, registrant, etc.)" },
    "dns_records": { "ns": ["ns1.example.com", "ns2.example.com"], "...": "..." }
  },
  "analysis_progress": null,
  "tech_summary": {
    "categories": [
      { "name": "Web servers", "count": 3 },
      { "name": "JavaScript frameworks", "count": 5 }
    ],
    "total": 12
  },
  "organization_name": "Example Corp"
}
StatusDetail
401Not authenticated.
403Forbidden — you do not have access to this domain.
404Domain not found.
{
  "detail": "Not authenticated."
}

Response Fields

domainstring

The domain name.

last_analyzedstring | null

ISO 8601 timestamp of when the authenticated user last submitted this domain for analysis. Each user sees their own analysis date, not a global timestamp.

statusstring

Analysis status: pending, processing, or completed.

countsobject

Total entity counts: emails, people, files, subdomains, usernames, related_domains.

security_metricsobject

Security indicators including spoofable_emails, leaked_emails, active_subdomains, takeover_vulnerable, passwords_exposed, people_with_emails, people_in_files, critical_vulnerabilities, high_vulnerabilities, login_pages_count, usernames_in_files, usernames_attributed, avg_services_emails, email_auth, breach_analytics, and posture.

posture is the External Posture index — a qualitative per-topic map keyed by stable topic id. Each value is one of good, watch, at-risk, or not-assessed. Topics are derived from existing aggregates and mapped to NIS2 Article 21 and CIS Controls v8 references:

  • email-auth — DMARC + SPF posture (NIS2 21(2)(h), CIS C9).
  • vulnerability — known CVEs on detected subdomain tech (NIS2 21(2)(e), CIS C7). not-assessed until detect_subdomain_technologies has run.
  • credential-exposure — breached emails / exposed passwords / recent breach activity (NIS2 21(2)(j), CIS C5).
  • attack-surface — public surface size relative to the requesting user's reported organisation size; flags internal subdomains with login pages (NIS2 21(2)(a), CIS C1).
  • shadow-it — third-party SaaS sprawl inferred from avg_services_emails (NIS2 21(2)(f), CIS C2). not-assessed until find_registered_sites_priority has run.
  • high-profile — privileged / executive people with breached linked emails (NIS2 21(2)(g), CIS C14).
  • crypto-dns — TLS grade plus DNSSEC and registrar-lock signals from WHOIS (NIS2 21(2)(h), ENS mp.com.*).

The index reflects only what is externally observable via OSINT. It is not a NIS2 / ENS compliance audit and does not measure internal controls.

email_auth is the structured email-authentication posture (DMARC + SPF) for the domain's canonical email zone. null until the spoofability check has run. When present:

  • spoofing_protection: tri-state — protected (DMARC p=reject enforced + SPF -all), partial (some controls in place but enforcement is incomplete), spoofable (DMARC p=none/missing with weak SPF), or unknown (not yet computed).
  • reasons: human-readable strings explaining each detected weakness; empty when fully protected.
  • dmarc: parsed DMARC policy (reject/quarantine/none/missing), pct percentage, the raw _dmarc.<domain> TXT record, and checked_at timestamp.
  • spf: parsed SPF policy (hard_fail/soft_fail/neutral/permissive/missing), the all-mechanism qualifier, the raw apex TXT record, and checked_at timestamp.

breach_analytics is the aggregated third-party breach exposure across the domain's discovered emails. Always present (never null); a domain with no breach signals yet returns all counts at zero. Fields:

  • total_breaches (number): distinct breaches affecting any of the domain's emails.
  • affected_emails (number): distinct emails with at least one breach link (any time).
  • recent_affected_emails (number): distinct emails affected by breaches whose breach_date falls inside the recent window (recent_window_years).
  • total_emails (number): total emails discovered for the domain.
  • recent_pct (number, 0–100): share of total_breaches whose breach_date falls inside the last recent_window_years.
  • recent_window_years (number): width of the recent window in years (default 2).
  • yearly_counts (array of { year, count }): distinct breaches per year for the timeline window (default last 10 calendar years ending in the current year), ascending by year. The series is densified server-side — every year in the window appears with count: 0 if no breaches landed that year, so the frontend sparkline draws a continuous line.
  • latest_breaches (array, max 3): most recent breaches by breach_date (descending; rows with a null breach_date sink to the bottom). Each entry: { name, title, breach_date, affected_count, pwn_count }.
posture_scorenumber | null

Posture Score from 0 to 100, where higher is better. Summed from the domain's security findings, severity-weighted and log-scaled, so a single critical finding dominates and clean assets contribute nothing. null when no score has been published: the score assumes a complete assessment, so it is absent while a scan is in flight, and also for a domain analysed before the Posture Score shipped — check status to tell the two apart. A new scan publishes it.

posture_trendarray | null

The domain's own Posture Score over time — one point per Monitoring run, oldest first, each { captured_at, score }. Every score is recomputed from the per-severity finding counts that run captured, so the series is a property of the domain rather than of the scoring formula, and a later change to the formula re-derives the whole history rather than putting a step in it.

null means there is no series for you to read — the domain is not one you monitor, and the points come from Monitoring runs. An empty array means the domain is monitored but no run has captured the counts yet. If your Monitoring on the domain is paused, the series stops where it stopped.

tls_gradestring | null

TLS/SSL security grade (A+, A, A-, B, C, D, E, F, T, M). null when not yet scanned, when HTTPS is not available, or when the TLS scanner could not complete the assessment. Use tls_scanned to check whether a scan was attempted.

tls_scannedboolean

Whether a TLS assessment has been attempted. A null grade with tls_scanned: true indicates the domain either does not serve HTTPS or the scanner could not complete the assessment.

highlightsobject

Dashboard highlights: most_exposed_people (excludes people with unlikely affiliation), interesting_subdomains, interesting_files.

domain_infoobject

WHOIS and DNS data. Top-level keys: registrar, creation_date, expiration_date (extracted from whois_data for quick access), plus the full raw whois_data and dns_records objects for clients that need every record type (NS, MX, TXT, SPF, DMARC, DNSSEC flags, etc.). Any field that is absent in the upstream WHOIS / DNS response is null.

analysis_progressobject | null

Progress indicator with phase and percentage. Only present when status is processing.

tech_summaryobject | null

Technology stack summary with categories (name + count + percentage).

organization_namestring | null

Organization name provided when the domain was first analyzed.

curl -X GET https://api.cyborux.com/api/domain/example.com/summary \
  -H "Authorization: Bearer YOUR_API_KEY"
const res = await fetch(
  "https://api.cyborux.com/api/domain/example.com/summary",
  { headers: { "Authorization": "Bearer YOUR_API_KEY" } }
);
const data = await res.json();
import requests

response = requests.get(
    "https://api.cyborux.com/api/domain/example.com/summary",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
)
data = response.json()