{"components":{"schemas":{"Dns":{"properties":{"a":{"items":{"type":"string"},"type":"array"},"aaaa":{"items":{"type":"string"},"type":"array"},"email":{"additionalProperties":true,"type":"object"},"error":{"type":["string","null"]},"mx":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"ns":{"items":{"type":"string"},"type":"array"},"txt_highlights":{"properties":{"caa":{"type":["string","null"]},"dmarc":{"type":["string","null"]},"spf":{"type":["string","null"]}},"type":"object"}},"type":"object"},"DomainInfo":{"properties":{"created_at":{"type":["string","null"]},"days_remaining":{"type":["integer","null"]},"error":{"type":["string","null"]},"expires_at":{"type":["string","null"]},"nameservers":{"items":{"type":"string"},"type":"array"},"registrar":{"type":["string","null"]},"source":{"type":"string"},"status":{"items":{"type":"string"},"type":"array"}},"type":"object"},"Error":{"properties":{"error":{"description":"Machine error code, e.g. INVALID_DOMAIN, BLOCKED_TARGET, RATE_LIMITED, NOT_FOUND.","type":"string"}},"required":["error"],"type":"object"},"Http":{"properties":{"alt_svc_h3":{"type":"boolean"},"compression":{"type":["string","object","null"]},"error":{"type":["string","null"]},"final_url":{"type":["string","null"]},"http2":{"type":["boolean","null"]},"https_enforced":{"type":"boolean"},"ipv6":{"additionalProperties":true,"type":"object"},"reachable":{"type":"boolean"},"redirect_chain":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"redirects":{"type":"integer"},"response_time_ms":{"type":["number","null"]},"security_headers":{"additionalProperties":true,"type":"object"},"server":{"type":["string","null"]},"status_code":{"type":["integer","null"]},"timing_ms":{"additionalProperties":true,"type":"object"},"ttfb_ms":{"type":["number","null"]}},"type":"object"},"Score":{"properties":{"findings":{"items":{"properties":{"code":{"type":"string"},"message":{"type":"string"},"section":{"type":"string"},"severity":{"enum":["ok","warn","fail","info"],"type":"string"},"value":{}},"type":"object"},"type":"array"},"grades":{"additionalProperties":{"properties":{"grade":{"type":["string","null"]},"score":{"type":["integer","null"]}},"type":"object"},"type":"object"},"overall":{"type":["integer","null"]}},"type":"object"},"Summary":{"properties":{"issues":{"items":{"type":"string"},"type":"array"},"status":{"enum":["healthy","warning","critical","unreachable","unknown"],"type":"string"}},"type":"object"},"Tls":{"properties":{"chain_valid":{"type":"boolean"},"days_remaining":{"type":["integer","null"]},"error":{"type":["string","null"]},"expired":{"type":"boolean"},"hostname_match":{"type":"boolean"},"issuer":{"type":["string","null"]},"not_after":{"type":["string","null"]},"not_before":{"type":["string","null"]},"protocol":{"type":["string","null"]},"sans":{"items":{"type":"string"},"type":"array"},"subject":{"type":["string","null"]},"valid":{"type":"boolean"}},"type":"object"}}},"info":{"description":"Free website-health checks: TLS, domain expiry, DNS, HTTP, email authentication, BGP/RPKI, CVE triage and AI agent readiness. Errors are {\"error\": \"<CODE>\"}. Rate limits are per visitor IP; rate-limited responses carry RateLimit-* headers.","title":"SysOSX Checker API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/api/check/agent-readiness":{"get":{"parameters":[{"description":"Hostname to check (no scheme, port or IP literal).","in":"query","name":"domain","required":true,"schema":{"example":"example.com","type":"string"}},{"description":"Pass fresh=1 to bypass the cached result and re-run the check (subject to a minimum recheck interval and stricter rate limits).","in":"query","name":"fresh","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"agent_ready":{"type":"boolean"},"cache_ttl_seconds":{"type":"integer"},"cached":{"type":"boolean"},"checked_at":{"format":"date-time","type":"string"},"domain":{"type":"string"},"error":{"type":["string","null"]},"fetches_used":{"type":"integer"},"final_url":{"type":["string","null"]},"findings":{"items":{"properties":{"est_points":{"type":"number"},"evidence":{"additionalProperties":true,"type":"object"},"fix":{"type":"string"},"id":{"type":"string"},"layer":{"type":"string"},"meaning":{"type":"string"},"points":{"type":"number"},"status":{"type":"string"},"title":{"type":"string"}},"type":"object"},"type":"array"},"fix_first":{"items":{"type":"string"},"type":"array"},"grade":{"type":["string","null"]},"layers":{"additionalProperties":{"properties":{"applicable":{"type":"integer"},"failed":{"type":"integer"},"max":{"type":"number"},"passed":{"type":"integer"},"score":{"type":"number"},"warnings":{"type":"integer"}},"type":"object"},"type":"object"},"report_url_id":{"type":"string"},"scan_region_note":{"type":"string"},"score":{"type":["number","null"]}},"type":"object"}}},"description":"Check result."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid domain (INVALID_DOMAIN)."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Target is blocked (BLOCKED_TARGET)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limited (RATE_LIMITED)."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Checker busy (CHECKER_BUSY)."}},"summary":"AI agent readiness scan (discovery / access / usability / payments layers)."}},"/api/check/bgp":{"get":{"parameters":[{"description":"IP address, CIDR prefix, or ASN (e.g. 1.1.1.1, 1.1.1.0/24, AS13335).","in":"query","name":"target","required":true,"schema":{"example":"AS13335","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"announced":{"type":["boolean","null"]},"asn":{"type":["object","null"]},"cached":{"type":"boolean"},"checked_at":{"format":"date-time","type":"string"},"error":{"type":["string","null"]},"first_seen":{"type":["string","null"]},"kind":{"enum":["asn","ip","prefix"],"type":"string"},"last_seen":{"type":["string","null"]},"origins":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"prefix":{"type":["string","null"]},"query":{"type":"string"},"rpki":{"type":["object","null"]},"sample_paths":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"target":{"type":"string"},"visibility":{"type":["object","null"]},"warnings":{"items":{"type":"string"},"type":"array"}},"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unparseable target (INVALID_TARGET)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limited (RATE_LIMITED)."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Checker busy (CHECKER_BUSY)."}},"summary":"BGP / RPKI lookup for an IP, prefix or ASN (RIPEstat). Upstream failure is a 200 envelope with error=upstream_unavailable."}},"/api/check/bulk-domains":{"post":{"requestBody":{"content":{"application/json":{"schema":{"properties":{"domains":{"items":{"type":"string"},"maxItems":50,"type":"array"}},"required":["domains"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cached":{"type":"boolean"},"checked_at":{"format":"date-time","type":"string"},"requested":{"type":"integer"},"results":{"items":{"properties":{"created":{"type":["string","null"]},"domain":{"type":"string"},"domain_days_left":{"type":["integer","null"]},"errors":{"items":{"type":"string"},"type":"array"},"expires":{"type":["string","null"]},"registrar":{"type":["string","null"]},"ssl":{"type":["object","null"]}},"type":"object"},"type":"array"}},"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request (INVALID_REQUEST) or more than 50 domains (TOO_MANY_DOMAINS)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limited (RATE_LIMITED)."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Checker busy (CHECKER_BUSY)."}},"summary":"Bulk domain + certificate check: RDAP registrar/expiry and TLS issuer/expiry for up to 50 domains in one batch. Junk entries return per-domain error results instead of failing the batch."}},"/api/check/cert-search":{"get":{"parameters":[{"description":"Hostname to check (no scheme, port or IP literal).","in":"query","name":"domain","required":true,"schema":{"example":"example.com","type":"string"}},{"description":"Pass fresh=1 to bypass the cached result and re-run the check (subject to a minimum recheck interval and stricter rate limits).","in":"query","name":"fresh","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cache_ttl_seconds":{"type":"integer"},"cached":{"type":"boolean"},"certificates":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"checked_at":{"format":"date-time","type":"string"},"count":{"type":"integer"},"domain":{"type":"string"},"error":{"type":["string","null"]},"report_url_id":{"type":"string"},"source":{"type":"string"},"total_count":{"type":"integer"},"truncated":{"type":"boolean"}},"type":"object"}}},"description":"Check result."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid domain (INVALID_DOMAIN)."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Target is blocked (BLOCKED_TARGET)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limited (RATE_LIMITED)."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Checker busy (CHECKER_BUSY)."}},"summary":"Certificate Transparency search via crt.sh."}},"/api/check/cve-triage":{"get":{"parameters":[{"description":"Comma/whitespace-separated CVE ids, case-insensitive; at most 200 are triaged, non-CVE tokens are echoed in `invalid`.","in":"query","name":"ids","required":true,"schema":{"example":"CVE-2021-44228,CVE-2023-4966","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cache_ttl_seconds":{"type":"integer"},"cached":{"type":"boolean"},"checked_at":{"format":"date-time","type":"string"},"feeds":{"additionalProperties":true,"type":"object"},"invalid":{"items":{"type":"string"},"type":"array"},"results":{"items":{"properties":{"cve_id":{"type":"string"},"cvss":{"additionalProperties":true,"type":"object"},"epss":{"type":["object","null"]},"found":{"type":"boolean"},"kev":{"type":["object","null"]},"priority":{"type":["string","null"]}},"type":"object"},"type":"array"},"submitted":{"type":"integer"},"truncated":{"type":"boolean"}},"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"No valid CVE ids (NO_VALID_IDS)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limited (RATE_LIMITED)."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Checker busy (CHECKER_BUSY)."}},"summary":"Bulk CVE triage by exploitation (CISA KEV + EPSS, CVSS from NVD)."}},"/api/check/dns-propagation":{"get":{"parameters":[{"description":"Hostname to check (no scheme, port or IP literal).","in":"query","name":"domain","required":true,"schema":{"example":"example.com","type":"string"}},{"description":"Pass fresh=1 to bypass the cached result and re-run the check (subject to a minimum recheck interval and stricter rate limits).","in":"query","name":"fresh","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cache_ttl_seconds":{"type":"integer"},"cached":{"type":"boolean"},"checked_at":{"format":"date-time","type":"string"},"consensus":{"type":["boolean","null"]},"domain":{"type":"string"},"error":{"type":["string","null"]},"report_url_id":{"type":"string"},"resolvers":{"items":{"additionalProperties":true,"type":"object"},"type":"array"}},"type":"object"}}},"description":"Check result."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid domain (INVALID_DOMAIN)."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Target is blocked (BLOCKED_TARGET)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limited (RATE_LIMITED)."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Checker busy (CHECKER_BUSY)."}},"summary":"A/AAAA answers for a domain from four public resolvers, with a consensus verdict."}},"/api/check/dnsbl":{"get":{"parameters":[{"description":"Hostname to check (no scheme, port or IP literal).","in":"query","name":"domain","required":true,"schema":{"example":"example.com","type":"string"}},{"description":"Pass fresh=1 to bypass the cached result and re-run the check (subject to a minimum recheck interval and stricter rate limits).","in":"query","name":"fresh","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cache_ttl_seconds":{"type":"integer"},"cached":{"type":"boolean"},"checked_at":{"format":"date-time","type":"string"},"domain":{"type":"string"},"domain_zones":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"error":{"type":["string","null"]},"ips":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"note":{"type":"string"},"report_url_id":{"type":"string"},"summary":{"additionalProperties":true,"type":"object"}},"type":"object"}}},"description":"Check result."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid domain (INVALID_DOMAIN)."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Target is blocked (BLOCKED_TARGET)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limited (RATE_LIMITED)."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Checker busy (CHECKER_BUSY)."}},"summary":"DNS blacklist check (IP and domain zones)."}},"/api/check/domain":{"get":{"parameters":[{"description":"Hostname to check (no scheme, port or IP literal).","in":"query","name":"domain","required":true,"schema":{"example":"example.com","type":"string"}},{"description":"Pass fresh=1 to bypass the cached result and re-run the check (subject to a minimum recheck interval and stricter rate limits).","in":"query","name":"fresh","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cache_ttl_seconds":{"type":"integer"},"cached":{"type":"boolean"},"checked_at":{"format":"date-time","type":"string"},"dns":{"properties":{"a":{"items":{"type":"string"},"type":"array"},"aaaa":{"items":{"type":"string"},"type":"array"},"email":{"additionalProperties":true,"type":"object"},"error":{"type":["string","null"]},"mx":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"ns":{"items":{"type":"string"},"type":"array"},"txt_highlights":{"properties":{"caa":{"type":["string","null"]},"dmarc":{"type":["string","null"]},"spf":{"type":["string","null"]}},"type":"object"}},"type":"object"},"domain":{"type":"string"},"domain_info":{"properties":{"created_at":{"type":["string","null"]},"days_remaining":{"type":["integer","null"]},"error":{"type":["string","null"]},"expires_at":{"type":["string","null"]},"nameservers":{"items":{"type":"string"},"type":"array"},"registrar":{"type":["string","null"]},"source":{"type":"string"},"status":{"items":{"type":"string"},"type":"array"}},"type":"object"},"report_url_id":{"type":"string"},"summary":{"properties":{"issues":{"items":{"type":"string"},"type":"array"},"status":{"enum":["healthy","warning","critical","unreachable","unknown"],"type":"string"}},"type":"object"}},"type":"object"}}},"description":"Check result."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid domain (INVALID_DOMAIN)."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Target is blocked (BLOCKED_TARGET)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limited (RATE_LIMITED)."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Checker busy (CHECKER_BUSY)."}},"summary":"Domain registration (RDAP) and DNS check."}},"/api/check/email-auth":{"get":{"parameters":[{"description":"Hostname to check (no scheme, port or IP literal).","in":"query","name":"domain","required":true,"schema":{"example":"example.com","type":"string"}},{"description":"Pass fresh=1 to bypass the cached result and re-run the check (subject to a minimum recheck interval and stricter rate limits).","in":"query","name":"fresh","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cache_ttl_seconds":{"type":"integer"},"cached":{"type":"boolean"},"checked_at":{"format":"date-time","type":"string"},"dkim":{"additionalProperties":true,"type":"object"},"dkim_note":{"type":"string"},"dmarc":{"additionalProperties":true,"type":"object"},"domain":{"type":"string"},"error":{"type":["string","null"]},"findings":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"mx":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"report_url_id":{"type":"string"},"spf":{"additionalProperties":true,"type":"object"}},"type":"object"}}},"description":"Check result."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid domain (INVALID_DOMAIN)."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Target is blocked (BLOCKED_TARGET)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limited (RATE_LIMITED)."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Checker busy (CHECKER_BUSY)."}},"summary":"Email authentication check (MX, SPF, DMARC, DKIM)."}},"/api/check/globalping":{"post":{"requestBody":{"content":{"application/json":{"schema":{"properties":{"locations":{"description":"Location search strings (Globalping \"magic\" locations).","items":{"type":"string"},"maxItems":4,"minItems":1,"type":"array"},"recordType":{"description":"DNS measurements only.","enum":["A","AAAA","CNAME","MX","NS","TXT","SOA","PTR"],"type":"string"},"target":{"type":"string"},"type":{"enum":["ping","http","dns","traceroute","mtr"],"type":"string"}},"required":["type","target","locations"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"error":{"type":["string","null"]},"id":{"type":"string"},"probes_count":{"type":["integer","null"]},"status":{"type":"string"},"target":{"type":"string"},"type":{"type":"string"}},"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request / type / target / location."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Blocked target (BLOCKED_TARGET)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limited (RATE_LIMITED) or upstream quota (UPSTREAM_RATE_LIMITED)."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Upstream unavailable (UPSTREAM_UNAVAILABLE)."}},"summary":"Create a Globalping measurement (ping / http / dns / traceroute / mtr from probes worldwide)."}},"/api/check/globalping/{measurement_id}":{"get":{"parameters":[{"in":"path","name":"measurement_id","required":true,"schema":{"pattern":"^[A-Za-z0-9]{10,40}$","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cached":{"type":"boolean"},"created_at":{"type":["string","null"]},"error":{"type":["string","null"]},"id":{"type":"string"},"probes":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"results":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"status":{"type":["string","null"]},"target":{"type":["string","null"]},"type":{"type":["string","null"]}},"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid id (INVALID_ID)."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found (NOT_FOUND)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limited (RATE_LIMITED)."},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Upstream unavailable (UPSTREAM_UNAVAILABLE)."}},"summary":"Poll one Globalping measurement."}},"/api/check/health":{"get":{"parameters":[{"description":"Hostname to check (no scheme, port or IP literal).","in":"query","name":"domain","required":true,"schema":{"example":"example.com","type":"string"}},{"description":"Pass fresh=1 to bypass the cached result and re-run the check (subject to a minimum recheck interval and stricter rate limits).","in":"query","name":"fresh","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cache_ttl_seconds":{"type":"integer"},"cached":{"type":"boolean"},"checked_at":{"format":"date-time","type":"string"},"dns":{"properties":{"a":{"items":{"type":"string"},"type":"array"},"aaaa":{"items":{"type":"string"},"type":"array"},"email":{"additionalProperties":true,"type":"object"},"error":{"type":["string","null"]},"mx":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"ns":{"items":{"type":"string"},"type":"array"},"txt_highlights":{"properties":{"caa":{"type":["string","null"]},"dmarc":{"type":["string","null"]},"spf":{"type":["string","null"]}},"type":"object"}},"type":"object"},"domain":{"type":"string"},"domain_info":{"properties":{"created_at":{"type":["string","null"]},"days_remaining":{"type":["integer","null"]},"error":{"type":["string","null"]},"expires_at":{"type":["string","null"]},"nameservers":{"items":{"type":"string"},"type":"array"},"registrar":{"type":["string","null"]},"source":{"type":"string"},"status":{"items":{"type":"string"},"type":"array"}},"type":"object"},"http":{"properties":{"alt_svc_h3":{"type":"boolean"},"compression":{"type":["string","object","null"]},"error":{"type":["string","null"]},"final_url":{"type":["string","null"]},"http2":{"type":["boolean","null"]},"https_enforced":{"type":"boolean"},"ipv6":{"additionalProperties":true,"type":"object"},"reachable":{"type":"boolean"},"redirect_chain":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"redirects":{"type":"integer"},"response_time_ms":{"type":["number","null"]},"security_headers":{"additionalProperties":true,"type":"object"},"server":{"type":["string","null"]},"status_code":{"type":["integer","null"]},"timing_ms":{"additionalProperties":true,"type":"object"},"ttfb_ms":{"type":["number","null"]}},"type":"object"},"report_url_id":{"type":"string"},"score":{"properties":{"findings":{"items":{"properties":{"code":{"type":"string"},"message":{"type":"string"},"section":{"type":"string"},"severity":{"enum":["ok","warn","fail","info"],"type":"string"},"value":{}},"type":"object"},"type":"array"},"grades":{"additionalProperties":{"properties":{"grade":{"type":["string","null"]},"score":{"type":["integer","null"]}},"type":"object"},"type":"object"},"overall":{"type":["integer","null"]}},"type":"object"},"summary":{"properties":{"issues":{"items":{"type":"string"},"type":"array"},"status":{"enum":["healthy","warning","critical","unreachable","unknown"],"type":"string"}},"type":"object"},"tls":{"properties":{"chain_valid":{"type":"boolean"},"days_remaining":{"type":["integer","null"]},"error":{"type":["string","null"]},"expired":{"type":"boolean"},"hostname_match":{"type":"boolean"},"issuer":{"type":["string","null"]},"not_after":{"type":["string","null"]},"not_before":{"type":["string","null"]},"protocol":{"type":["string","null"]},"sans":{"items":{"type":"string"},"type":"array"},"subject":{"type":["string","null"]},"valid":{"type":"boolean"}},"type":"object"}},"type":"object"}}},"description":"Check result."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid domain (INVALID_DOMAIN)."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Target is blocked (BLOCKED_TARGET)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limited (RATE_LIMITED)."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Checker busy (CHECKER_BUSY)."}},"summary":"Full website health check (HTTP, TLS, domain, DNS) with a scored summary."}},"/api/check/http-chain":{"get":{"parameters":[{"description":"URL or hostname to trace.","in":"query","name":"url","required":true,"schema":{"example":"http://example.com","type":"string"}},{"description":"Pass fresh=1 to bypass the cached result and re-run the check (subject to a minimum recheck interval and stricter rate limits).","in":"query","name":"fresh","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cache_ttl_seconds":{"type":"integer"},"cached":{"type":"boolean"},"chain":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"checked_at":{"format":"date-time","type":"string"},"domain":{"type":"string"},"error":{"type":["string","null"]},"final_status":{"type":["integer","null"]},"final_url":{"type":["string","null"]},"reachable":{"type":["boolean","null"]},"redirects":{"type":["integer","null"]},"response_time_ms":{"type":["number","null"]},"security_headers":{"type":["object","null"]},"server":{"type":["string","null"]},"timing_ms":{"type":["object","null"]},"url":{"type":"string"}},"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid URL (INVALID_DOMAIN)."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Blocked target (BLOCKED_TARGET)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limited (RATE_LIMITED)."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Checker busy (CHECKER_BUSY)."}},"summary":"Redirect chain for one URL, traced from the checker server (starting scheme is the one entered; bare host defaults to https)."}},"/api/check/ping":{"get":{"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"},"version":{"type":"string"}},"required":["ok","version"],"type":"object"}}},"description":"Success."}},"summary":"Liveness probe."}},"/api/check/port-scan":{"get":{"parameters":[{"description":"Hostname to check (no scheme, port or IP literal).","in":"query","name":"domain","required":true,"schema":{"example":"example.com","type":"string"}},{"description":"Pass fresh=1 to bypass the cached result and re-run the check (subject to a minimum recheck interval and stricter rate limits).","in":"query","name":"fresh","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cache_ttl_seconds":{"type":"integer"},"cached":{"type":"boolean"},"checked_at":{"format":"date-time","type":"string"},"counts":{"additionalProperties":true,"type":"object"},"domain":{"type":"string"},"error":{"type":["string","null"]},"note":{"type":"string"},"open_ports":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"ports":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"report_url_id":{"type":"string"},"resolved_ip":{"type":["string","null"]}},"type":"object"}}},"description":"Check result."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid domain (INVALID_DOMAIN)."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Target is blocked (BLOCKED_TARGET)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limited (RATE_LIMITED)."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Checker busy (CHECKER_BUSY)."}},"summary":"Connect-only scan of a curated port list."}},"/api/check/ssl":{"get":{"parameters":[{"description":"Hostname to check (no scheme, port or IP literal).","in":"query","name":"domain","required":true,"schema":{"example":"example.com","type":"string"}},{"description":"Pass fresh=1 to bypass the cached result and re-run the check (subject to a minimum recheck interval and stricter rate limits).","in":"query","name":"fresh","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cache_ttl_seconds":{"type":"integer"},"cached":{"type":"boolean"},"checked_at":{"format":"date-time","type":"string"},"domain":{"type":"string"},"report_url_id":{"type":"string"},"summary":{"properties":{"issues":{"items":{"type":"string"},"type":"array"},"status":{"enum":["healthy","warning","critical","unreachable","unknown"],"type":"string"}},"type":"object"},"tls":{"properties":{"chain_valid":{"type":"boolean"},"days_remaining":{"type":["integer","null"]},"error":{"type":["string","null"]},"expired":{"type":"boolean"},"hostname_match":{"type":"boolean"},"issuer":{"type":["string","null"]},"not_after":{"type":["string","null"]},"not_before":{"type":["string","null"]},"protocol":{"type":["string","null"]},"sans":{"items":{"type":"string"},"type":"array"},"subject":{"type":["string","null"]},"valid":{"type":"boolean"}},"type":"object"}},"type":"object"}}},"description":"Check result."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid domain (INVALID_DOMAIN)."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Target is blocked (BLOCKED_TARGET)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limited (RATE_LIMITED)."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Checker busy (CHECKER_BUSY)."}},"summary":"Quick TLS certificate check."}},"/api/check/ssl-grade":{"get":{"parameters":[{"description":"Hostname to check (no scheme, port or IP literal).","in":"query","name":"domain","required":true,"schema":{"example":"example.com","type":"string"}},{"description":"Pass fresh=1 to bypass the cached result and re-run the check (subject to a minimum recheck interval and stricter rate limits).","in":"query","name":"fresh","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cache_ttl_seconds":{"type":"integer"},"cached":{"type":"boolean"},"certificate":{"additionalProperties":true,"type":"object"},"checked_at":{"format":"date-time","type":"string"},"domain":{"type":"string"},"error":{"type":["string","null"]},"grade":{"type":["string","null"]},"grade_findings":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"hsts":{"additionalProperties":true,"type":"object"},"ocsp_stapling":{"type":"string"},"protocols":{"additionalProperties":true,"type":"object"},"report_url_id":{"type":"string"}},"type":"object"}}},"description":"Check result."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid domain (INVALID_DOMAIN)."},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Target is blocked (BLOCKED_TARGET)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limited (RATE_LIMITED)."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Checker busy (CHECKER_BUSY)."}},"summary":"Deep TLS audit: protocol matrix, certificate detail, HSTS and a letter grade."}},"/api/report/{report_id}":{"get":{"parameters":[{"in":"path","name":"report_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"description":"A stored report as originally produced by the health, SSL, domain or agent-readiness check (same fields, plus cached=true when served from storage). Older reports may lack score.","type":"object"}}},"description":"Success."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found (NOT_FOUND)."}},"summary":"Alias of /report/{report_id}."}},"/api/waitlist":{"post":{"requestBody":{"content":{"application/json":{"schema":{"properties":{"email":{"format":"email","maxLength":254,"type":"string"},"source":{"description":"Optional source tag; truncated to 100 chars.","type":"string"}},"required":["email"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"ok":{"type":"boolean"}},"required":["ok"],"type":"object"}}},"description":"Success."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid email (INVALID_EMAIL)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limited (RATE_LIMITED)."}},"summary":"Join the waitlist."}},"/openapi.json":{"get":{"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Success."}},"summary":"This OpenAPI document."}},"/report/{report_id}":{"get":{"parameters":[{"in":"path","name":"report_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"description":"A stored report as originally produced by the health, SSL, domain or agent-readiness check (same fields, plus cached=true when served from storage). Older reports may lack score.","type":"object"}}},"description":"Success."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found (NOT_FOUND)."}},"summary":"Stored report JSON by share id."}}},"servers":[{"url":"https://www.sysosx.com"}]}
