Domain Summary
Retrieve a dashboard summary for a domain, optimized for fast page load.
/api/domain/{domain_name}/summaryBearer <token>API key authentication — use your Cyborux API key as a Bearer token.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
domain_name | string | The 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"
}| Status | Detail |
|---|---|
401 | Not authenticated. |
403 | Forbidden — you do not have access to this domain. |
404 | Domain not found. |
{
"detail": "Not authenticated."
}Response Fields
domainstringThe domain name.
last_analyzedstring | nullISO 8601 timestamp of when the authenticated user last submitted this domain for analysis. Each user sees their own analysis date, not a global timestamp.
statusstringAnalysis status: pending, processing, or completed.
countsobjectTotal entity counts: emails, people, files, subdomains, usernames, related_domains.
security_metricsobjectSecurity 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-assesseduntildetect_subdomain_technologieshas 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 fromavg_services_emails(NIS2 21(2)(f), CIS C2).not-assesseduntilfind_registered_sites_priorityhas 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(DMARCp=rejectenforced + SPF-all),partial(some controls in place but enforcement is incomplete),spoofable(DMARCp=none/missing with weak SPF), orunknown(not yet computed).reasons: human-readable strings explaining each detected weakness; empty when fully protected.dmarc: parsed DMARC policy (reject/quarantine/none/missing),pctpercentage, the raw_dmarc.<domain>TXT record, andchecked_attimestamp.spf: parsed SPF policy (hard_fail/soft_fail/neutral/permissive/missing), theall-mechanism qualifier, the raw apex TXT record, andchecked_attimestamp.
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 whosebreach_datefalls inside the recent window (recent_window_years).total_emails(number): total emails discovered for the domain.recent_pct(number, 0–100): share oftotal_breacheswhosebreach_datefalls inside the lastrecent_window_years.recent_window_years(number): width of the recent window in years (default2).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 withcount: 0if no breaches landed that year, so the frontend sparkline draws a continuous line.latest_breaches(array, max 3): most recent breaches bybreach_date(descending; rows with anullbreach_datesink to the bottom). Each entry:{ name, title, breach_date, affected_count, pwn_count }.
posture_scorenumber | nullPosture 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 | nullThe 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 | nullTLS/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_scannedbooleanWhether 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.
highlightsobjectDashboard highlights: most_exposed_people (excludes people with unlikely affiliation), interesting_subdomains, interesting_files.
domain_infoobjectWHOIS 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 | nullProgress indicator with phase and percentage. Only present when status is processing.
tech_summaryobject | nullTechnology stack summary with categories (name + count + percentage).
organization_namestring | nullOrganization 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()