{"openapi":"3.1.0","info":{"title":"CubDomain API","version":"1.0.0","summary":"Domain data as JSON: WHOIS, DNS, SSL, email security, HTTP checks and the health score.","description":"The same data as CubDomain’s domain reports. Every call sends an API key as a Bearer token: cd_live_… keys use credits; cd_test_… keys return sample data for any domain and use none. Answers come from our stored report unless fresh=true. Errors are {\"error\":{\"code\",\"message\"}}, and failed calls are free.","termsOfService":"https://www.cubdomain.com/api/terms","contact":{"name":"CubDomain support","email":"support@cubdomain.com","url":"https://www.cubdomain.com/contact"}},"externalDocs":{"description":"The API docs","url":"https://www.cubdomain.com/api/docs"},"servers":[{"url":"https://api.cubdomain.com/v1"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Domains","description":"Data about a domain. Each call uses credits."},{"name":"Account","description":"Your plan and credits. Free."}],"paths":{"/domains/{domain}/report":{"get":{"operationId":"getReport","summary":"Every check on a domain, with the health score","description":"10 credits; 20 with fresh=true. See https://www.cubdomain.com/api/docs/report.","tags":["Domains"],"parameters":[{"name":"domain","in":"path","required":true,"description":"The domain to check, without https:// or a path. Subdomains work too.","schema":{"type":"string"},"example":"example.com"},{"name":"sections","in":"query","required":false,"description":"Comma-separated, to return only some sections, such as ssl,dns. The credits are the same. Choose from score, whois, dns, ssl, hosting, safety, email_security, http, performance, ai_files.","schema":{"type":"string"},"example":"ssl,dns"},{"name":"fresh","in":"query","required":false,"description":"true runs the checks live instead of reading our stored report. Costs twice the credits; paid plans only.","schema":{"type":"boolean","default":false}},{"name":"timeout","in":"query","required":false,"description":"Seconds to wait for slow sites, 5–30. Sections still running then are left out and listed in incomplete.","schema":{"type":"integer","minimum":5,"maximum":30,"default":15}}],"x-credits":10,"responses":{"200":{"description":"OK","headers":{"X-Credits-Used":{"$ref":"#/components/headers/X-Credits-Used"},"X-Credits-Remaining":{"$ref":"#/components/headers/X-Credits-Remaining"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportResponse"},"example":{"domain":"example.com","checked_at":"2026-10-25T01:42:10Z","cached":true,"score":{"value":82,"grade":"B","cap":null,"bars":[{"key":"ssl","weight":30,"score":100},{"key":"headers","weight":20,"score":67},{"key":"email","weight":20,"score":75},{"key":"performance","weight":15,"score":80},{"key":"standards","weight":15,"score":80}],"version":1},"whois":{"registrar":"Example Registrar, Inc.","created":"1995-08-14","updated":"2026-08-14","expires":"2027-08-13","status":["clientTransferProhibited","clientUpdateProhibited"],"name_servers":["ns1.example.com","ns2.example.com"],"dnssec":"unsigned","source":"rdap"},"dns":{"a":["192.0.2.10"],"aaaa":["2001:db8::10"],"cname":[],"mx":[{"host":"mail.example.com","pri":10}],"ns":["ns1.example.com","ns2.example.com"],"txt":["v=spf1 include:_spf.example.net -all"],"caa":["0 issue \"letsencrypt.org\""],"soa":"ns1.example.com hostmaster.example.com 2026102501 7200 3600 1209600 300"},"ssl":{"status":"valid","valid":true,"issuer":"Let's Encrypt","subject":"example.com","valid_from":"2026-09-10","valid_to":"2026-12-09","days_left":45,"problem":null,"names":["example.com","www.example.com"]},"hosting":{"country":"US","asn":"AS64500","network":"Example Hosting LLC","countries":1,"servers":[{"ip":"192.0.2.10","country":"US","country_name":"United States","city":"Ashburn","asn":"AS64500","network":"Example Hosting LLC"}]},"safety":{"source":"wot","status":"safe","reputation":92,"confidence":64,"child_safety_reputation":90,"categories":["Good site"]},"email_security":{"spf":{"status":"pass","value":"v=spf1 include:_spf.example.net -all"},"dmarc":{"status":"pass","value":"v=DMARC1; p=reject; rua=mailto:dmarc@example.com"},"dmarc_policy":"reject","dkim":{"status":"pass","value":"selector selector1._domainkey"},"mta_sts":{"status":"missing","value":null},"bimi":{"status":"none","value":null},"mx_count":1},"http":{"final_url":"https://www.example.com/","status":200,"https":true,"redirects":[{"url":"http://example.com/","status":301},{"url":"https://example.com/","status":301},{"url":"https://www.example.com/","status":200}],"http3":true,"tls13":true,"ipv6":false,"hsts_preload":false,"headers":{"strict-transport-security":{"status":"pass","value":"max-age=31536000; includeSubDomains"},"content-security-policy":{"status":"missing","value":null},"x-frame-options":{"status":"pass","value":"SAMEORIGIN"},"x-content-type-options":{"status":"pass","value":"nosniff"},"referrer-policy":{"status":"pass","value":"strict-origin-when-cross-origin"},"permissions-policy":{"status":"missing","value":null}}},"performance":{"source":"chrome_ux_report","origin":"https://www.example.com","phone":{"lcp_ms":2100,"inp_ms":180,"cls":0.05},"desktop":{"lcp_ms":1400,"inp_ms":90,"cls":0.02}},"ai_files":{"robots_txt":true,"llms_txt":true,"llms_full_txt":false,"sitemaps":["https://www.example.com/sitemap.xml"],"ai_crawlers":{"GPTBot":"blocked","ClaudeBot":"allowed"}},"incomplete":[]}}}},"400":{"description":"Bad Request: invalid_domain, invalid_parameter.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_domain":{"summary":"The domain isn’t valid. Send just the name, like example.com, without https:// or a path.","value":{"error":{"code":"invalid_domain","message":"The domain isn’t valid. Send just the name, like example.com, without https:// or a path."}}},"invalid_parameter":{"summary":"A query parameter isn’t valid, such as an unknown section or a timeout outside 5–30.","value":{"error":{"code":"invalid_parameter","message":"A query parameter isn’t valid, such as an unknown section or a timeout outside 5–30."}}}}}}},"401":{"description":"Unauthorized: invalid_key.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_key":{"summary":"The API key is missing, wrong or revoked.","value":{"error":{"code":"invalid_key","message":"The API key is missing, wrong or revoked."}}}}}}},"402":{"description":"Payment Required: out_of_credits.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"out_of_credits":{"summary":"Not enough credits left this period for this call.","value":{"error":{"code":"out_of_credits","message":"Not enough credits left this period for this call."}}}}}}},"403":{"description":"Forbidden: account_blocked, ip_not_allowed, plan_required.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"account_blocked":{"summary":"API access is blocked on this account. Contact us.","value":{"error":{"code":"account_blocked","message":"API access is blocked on this account. Contact us."}}},"ip_not_allowed":{"summary":"The key can’t be used from this IP address (its allowlist).","value":{"error":{"code":"ip_not_allowed","message":"The key can’t be used from this IP address (its allowlist)."}}},"plan_required":{"summary":"fresh=true isn’t on your plan.","value":{"error":{"code":"plan_required","message":"fresh=true isn’t on your plan."}}}}}}},"404":{"description":"Not Found: domain_not_found.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"domain_not_found":{"summary":"The domain doesn’t exist, or has nothing to show for this.","value":{"error":{"code":"domain_not_found","message":"The domain doesn’t exist, or has nothing to show for this."}}}}}}},"429":{"description":"Too Many Requests: rate_limited.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"summary":"Too many requests this second. Wait for Retry-After seconds.","value":{"error":{"code":"rate_limited","message":"Too many requests this second. Wait for Retry-After seconds."}}}}}}},"500":{"description":"Internal Server Error: server_error.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"server_error":{"summary":"Our side failed. You weren’t charged; try again later.","value":{"error":{"code":"server_error","message":"Our side failed. You weren’t charged; try again later."}}}}}}},"503":{"description":"Service Unavailable: api_unavailable, maintenance.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"api_unavailable":{"summary":"The API isn’t open.","value":{"error":{"code":"api_unavailable","message":"The API isn’t open."}}},"maintenance":{"summary":"The API is down for maintenance. Try again shortly.","value":{"error":{"code":"maintenance","message":"The API is down for maintenance. Try again shortly."}}}}}}}}}},"/domains/{domain}/whois":{"get":{"operationId":"getWhois","summary":"Registration data from RDAP or WHOIS","description":"1 credit; 2 with fresh=true. See https://www.cubdomain.com/api/docs/whois.","tags":["Domains"],"parameters":[{"name":"domain","in":"path","required":true,"description":"The domain to check, without https:// or a path. Subdomains work too.","schema":{"type":"string"},"example":"example.com"},{"name":"fresh","in":"query","required":false,"description":"true runs the checks live instead of reading our stored report. Costs twice the credits; paid plans only.","schema":{"type":"boolean","default":false}}],"x-credits":1,"responses":{"200":{"description":"OK","headers":{"X-Credits-Used":{"$ref":"#/components/headers/X-Credits-Used"},"X-Credits-Remaining":{"$ref":"#/components/headers/X-Credits-Remaining"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhoisResponse"},"example":{"domain":"example.com","checked_at":"2026-10-25T01:42:10Z","cached":true,"whois":{"registrar":"Example Registrar, Inc.","created":"1995-08-14","updated":"2026-08-14","expires":"2027-08-13","status":["clientTransferProhibited","clientUpdateProhibited"],"name_servers":["ns1.example.com","ns2.example.com"],"dnssec":"unsigned","source":"rdap"}}}}},"400":{"description":"Bad Request: invalid_domain.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_domain":{"summary":"The domain isn’t valid. Send just the name, like example.com, without https:// or a path.","value":{"error":{"code":"invalid_domain","message":"The domain isn’t valid. Send just the name, like example.com, without https:// or a path."}}}}}}},"401":{"description":"Unauthorized: invalid_key.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_key":{"summary":"The API key is missing, wrong or revoked.","value":{"error":{"code":"invalid_key","message":"The API key is missing, wrong or revoked."}}}}}}},"402":{"description":"Payment Required: out_of_credits.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"out_of_credits":{"summary":"Not enough credits left this period for this call.","value":{"error":{"code":"out_of_credits","message":"Not enough credits left this period for this call."}}}}}}},"403":{"description":"Forbidden: account_blocked, ip_not_allowed, plan_required.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"account_blocked":{"summary":"API access is blocked on this account. Contact us.","value":{"error":{"code":"account_blocked","message":"API access is blocked on this account. Contact us."}}},"ip_not_allowed":{"summary":"The key can’t be used from this IP address (its allowlist).","value":{"error":{"code":"ip_not_allowed","message":"The key can’t be used from this IP address (its allowlist)."}}},"plan_required":{"summary":"fresh=true isn’t on your plan.","value":{"error":{"code":"plan_required","message":"fresh=true isn’t on your plan."}}}}}}},"404":{"description":"Not Found: domain_not_found.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"domain_not_found":{"summary":"The domain doesn’t exist, or has nothing to show for this.","value":{"error":{"code":"domain_not_found","message":"The domain doesn’t exist, or has nothing to show for this."}}}}}}},"429":{"description":"Too Many Requests: rate_limited.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"summary":"Too many requests this second. Wait for Retry-After seconds.","value":{"error":{"code":"rate_limited","message":"Too many requests this second. Wait for Retry-After seconds."}}}}}}},"500":{"description":"Internal Server Error: server_error.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"server_error":{"summary":"Our side failed. You weren’t charged; try again later.","value":{"error":{"code":"server_error","message":"Our side failed. You weren’t charged; try again later."}}}}}}},"503":{"description":"Service Unavailable: api_unavailable, maintenance.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"api_unavailable":{"summary":"The API isn’t open.","value":{"error":{"code":"api_unavailable","message":"The API isn’t open."}}},"maintenance":{"summary":"The API is down for maintenance. Try again shortly.","value":{"error":{"code":"maintenance","message":"The API is down for maintenance. Try again shortly."}}}}}}}}}},"/domains/{domain}/dns":{"get":{"operationId":"getDns","summary":"DNS records grouped by type","description":"1 credit; 2 with fresh=true. See https://www.cubdomain.com/api/docs/dns.","tags":["Domains"],"parameters":[{"name":"domain","in":"path","required":true,"description":"The domain to check, without https:// or a path. Subdomains work too.","schema":{"type":"string"},"example":"example.com"},{"name":"fresh","in":"query","required":false,"description":"true runs the checks live instead of reading our stored report. Costs twice the credits; paid plans only.","schema":{"type":"boolean","default":false}}],"x-credits":1,"responses":{"200":{"description":"OK","headers":{"X-Credits-Used":{"$ref":"#/components/headers/X-Credits-Used"},"X-Credits-Remaining":{"$ref":"#/components/headers/X-Credits-Remaining"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsResponse"},"example":{"domain":"example.com","checked_at":"2026-10-25T01:42:10Z","cached":true,"dns":{"a":["192.0.2.10"],"aaaa":["2001:db8::10"],"cname":[],"mx":[{"host":"mail.example.com","pri":10}],"ns":["ns1.example.com","ns2.example.com"],"txt":["v=spf1 include:_spf.example.net -all"],"caa":["0 issue \"letsencrypt.org\""],"soa":"ns1.example.com hostmaster.example.com 2026102501 7200 3600 1209600 300"}}}}},"400":{"description":"Bad Request: invalid_domain.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_domain":{"summary":"The domain isn’t valid. Send just the name, like example.com, without https:// or a path.","value":{"error":{"code":"invalid_domain","message":"The domain isn’t valid. Send just the name, like example.com, without https:// or a path."}}}}}}},"401":{"description":"Unauthorized: invalid_key.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_key":{"summary":"The API key is missing, wrong or revoked.","value":{"error":{"code":"invalid_key","message":"The API key is missing, wrong or revoked."}}}}}}},"402":{"description":"Payment Required: out_of_credits.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"out_of_credits":{"summary":"Not enough credits left this period for this call.","value":{"error":{"code":"out_of_credits","message":"Not enough credits left this period for this call."}}}}}}},"403":{"description":"Forbidden: account_blocked, ip_not_allowed, plan_required.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"account_blocked":{"summary":"API access is blocked on this account. Contact us.","value":{"error":{"code":"account_blocked","message":"API access is blocked on this account. Contact us."}}},"ip_not_allowed":{"summary":"The key can’t be used from this IP address (its allowlist).","value":{"error":{"code":"ip_not_allowed","message":"The key can’t be used from this IP address (its allowlist)."}}},"plan_required":{"summary":"fresh=true isn’t on your plan.","value":{"error":{"code":"plan_required","message":"fresh=true isn’t on your plan."}}}}}}},"404":{"description":"Not Found: domain_not_found.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"domain_not_found":{"summary":"The domain doesn’t exist, or has nothing to show for this.","value":{"error":{"code":"domain_not_found","message":"The domain doesn’t exist, or has nothing to show for this."}}}}}}},"429":{"description":"Too Many Requests: rate_limited.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"summary":"Too many requests this second. Wait for Retry-After seconds.","value":{"error":{"code":"rate_limited","message":"Too many requests this second. Wait for Retry-After seconds."}}}}}}},"500":{"description":"Internal Server Error: server_error.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"server_error":{"summary":"Our side failed. You weren’t charged; try again later.","value":{"error":{"code":"server_error","message":"Our side failed. You weren’t charged; try again later."}}}}}}},"503":{"description":"Service Unavailable: api_unavailable, maintenance.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"api_unavailable":{"summary":"The API isn’t open.","value":{"error":{"code":"api_unavailable","message":"The API isn’t open."}}},"maintenance":{"summary":"The API is down for maintenance. Try again shortly.","value":{"error":{"code":"maintenance","message":"The API is down for maintenance. Try again shortly."}}}}}}}}}},"/domains/{domain}/ssl":{"get":{"operationId":"getSsl","summary":"The certificate the site serves","description":"1 credit; 2 with fresh=true. See https://www.cubdomain.com/api/docs/ssl.","tags":["Domains"],"parameters":[{"name":"domain","in":"path","required":true,"description":"The domain to check, without https:// or a path. Subdomains work too.","schema":{"type":"string"},"example":"example.com"},{"name":"fresh","in":"query","required":false,"description":"true runs the checks live instead of reading our stored report. Costs twice the credits; paid plans only.","schema":{"type":"boolean","default":false}}],"x-credits":1,"responses":{"200":{"description":"OK","headers":{"X-Credits-Used":{"$ref":"#/components/headers/X-Credits-Used"},"X-Credits-Remaining":{"$ref":"#/components/headers/X-Credits-Remaining"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SslResponse"},"example":{"domain":"example.com","checked_at":"2026-10-25T01:42:10Z","cached":true,"ssl":{"status":"valid","valid":true,"issuer":"Let's Encrypt","subject":"example.com","valid_from":"2026-09-10","valid_to":"2026-12-09","days_left":45,"problem":null,"names":["example.com","www.example.com"]}}}}},"400":{"description":"Bad Request: invalid_domain.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_domain":{"summary":"The domain isn’t valid. Send just the name, like example.com, without https:// or a path.","value":{"error":{"code":"invalid_domain","message":"The domain isn’t valid. Send just the name, like example.com, without https:// or a path."}}}}}}},"401":{"description":"Unauthorized: invalid_key.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_key":{"summary":"The API key is missing, wrong or revoked.","value":{"error":{"code":"invalid_key","message":"The API key is missing, wrong or revoked."}}}}}}},"402":{"description":"Payment Required: out_of_credits.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"out_of_credits":{"summary":"Not enough credits left this period for this call.","value":{"error":{"code":"out_of_credits","message":"Not enough credits left this period for this call."}}}}}}},"403":{"description":"Forbidden: account_blocked, ip_not_allowed, plan_required.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"account_blocked":{"summary":"API access is blocked on this account. Contact us.","value":{"error":{"code":"account_blocked","message":"API access is blocked on this account. Contact us."}}},"ip_not_allowed":{"summary":"The key can’t be used from this IP address (its allowlist).","value":{"error":{"code":"ip_not_allowed","message":"The key can’t be used from this IP address (its allowlist)."}}},"plan_required":{"summary":"fresh=true isn’t on your plan.","value":{"error":{"code":"plan_required","message":"fresh=true isn’t on your plan."}}}}}}},"404":{"description":"Not Found: domain_not_found.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"domain_not_found":{"summary":"The domain doesn’t exist, or has nothing to show for this.","value":{"error":{"code":"domain_not_found","message":"The domain doesn’t exist, or has nothing to show for this."}}}}}}},"429":{"description":"Too Many Requests: rate_limited.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"summary":"Too many requests this second. Wait for Retry-After seconds.","value":{"error":{"code":"rate_limited","message":"Too many requests this second. Wait for Retry-After seconds."}}}}}}},"500":{"description":"Internal Server Error: server_error.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"server_error":{"summary":"Our side failed. You weren’t charged; try again later.","value":{"error":{"code":"server_error","message":"Our side failed. You weren’t charged; try again later."}}}}}}},"503":{"description":"Service Unavailable: api_unavailable, maintenance.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"api_unavailable":{"summary":"The API isn’t open.","value":{"error":{"code":"api_unavailable","message":"The API isn’t open."}}},"maintenance":{"summary":"The API is down for maintenance. Try again shortly.","value":{"error":{"code":"maintenance","message":"The API is down for maintenance. Try again shortly."}}}}}}}}}},"/domains/{domain}/email-security":{"get":{"operationId":"getEmailSecurity","summary":"SPF, DMARC, DKIM, MTA-STS and BIMI","description":"1 credit; 2 with fresh=true. See https://www.cubdomain.com/api/docs/email-security.","tags":["Domains"],"parameters":[{"name":"domain","in":"path","required":true,"description":"The domain to check, without https:// or a path. Subdomains work too.","schema":{"type":"string"},"example":"example.com"},{"name":"fresh","in":"query","required":false,"description":"true runs the checks live instead of reading our stored report. Costs twice the credits; paid plans only.","schema":{"type":"boolean","default":false}}],"x-credits":1,"responses":{"200":{"description":"OK","headers":{"X-Credits-Used":{"$ref":"#/components/headers/X-Credits-Used"},"X-Credits-Remaining":{"$ref":"#/components/headers/X-Credits-Remaining"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailSecurityResponse"},"example":{"domain":"example.com","checked_at":"2026-10-25T01:42:10Z","cached":true,"email_security":{"spf":{"status":"pass","value":"v=spf1 include:_spf.example.net -all"},"dmarc":{"status":"pass","value":"v=DMARC1; p=reject; rua=mailto:dmarc@example.com"},"dmarc_policy":"reject","dkim":{"status":"pass","value":"selector selector1._domainkey"},"mta_sts":{"status":"missing","value":null},"bimi":{"status":"none","value":null},"mx_count":1}}}}},"400":{"description":"Bad Request: invalid_domain.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_domain":{"summary":"The domain isn’t valid. Send just the name, like example.com, without https:// or a path.","value":{"error":{"code":"invalid_domain","message":"The domain isn’t valid. Send just the name, like example.com, without https:// or a path."}}}}}}},"401":{"description":"Unauthorized: invalid_key.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_key":{"summary":"The API key is missing, wrong or revoked.","value":{"error":{"code":"invalid_key","message":"The API key is missing, wrong or revoked."}}}}}}},"402":{"description":"Payment Required: out_of_credits.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"out_of_credits":{"summary":"Not enough credits left this period for this call.","value":{"error":{"code":"out_of_credits","message":"Not enough credits left this period for this call."}}}}}}},"403":{"description":"Forbidden: account_blocked, ip_not_allowed, plan_required.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"account_blocked":{"summary":"API access is blocked on this account. Contact us.","value":{"error":{"code":"account_blocked","message":"API access is blocked on this account. Contact us."}}},"ip_not_allowed":{"summary":"The key can’t be used from this IP address (its allowlist).","value":{"error":{"code":"ip_not_allowed","message":"The key can’t be used from this IP address (its allowlist)."}}},"plan_required":{"summary":"fresh=true isn’t on your plan.","value":{"error":{"code":"plan_required","message":"fresh=true isn’t on your plan."}}}}}}},"404":{"description":"Not Found: domain_not_found.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"domain_not_found":{"summary":"The domain doesn’t exist, or has nothing to show for this.","value":{"error":{"code":"domain_not_found","message":"The domain doesn’t exist, or has nothing to show for this."}}}}}}},"429":{"description":"Too Many Requests: rate_limited.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"summary":"Too many requests this second. Wait for Retry-After seconds.","value":{"error":{"code":"rate_limited","message":"Too many requests this second. Wait for Retry-After seconds."}}}}}}},"500":{"description":"Internal Server Error: server_error.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"server_error":{"summary":"Our side failed. You weren’t charged; try again later.","value":{"error":{"code":"server_error","message":"Our side failed. You weren’t charged; try again later."}}}}}}},"503":{"description":"Service Unavailable: api_unavailable, maintenance.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"api_unavailable":{"summary":"The API isn’t open.","value":{"error":{"code":"api_unavailable","message":"The API isn’t open."}}},"maintenance":{"summary":"The API is down for maintenance. Try again shortly.","value":{"error":{"code":"maintenance","message":"The API is down for maintenance. Try again shortly."}}}}}}}}}},"/domains/{domain}/http":{"get":{"operationId":"getHttp","summary":"Redirects, protocols and security headers","description":"1 credit; 2 with fresh=true. See https://www.cubdomain.com/api/docs/http.","tags":["Domains"],"parameters":[{"name":"domain","in":"path","required":true,"description":"The domain to check, without https:// or a path. Subdomains work too.","schema":{"type":"string"},"example":"example.com"},{"name":"fresh","in":"query","required":false,"description":"true runs the checks live instead of reading our stored report. Costs twice the credits; paid plans only.","schema":{"type":"boolean","default":false}}],"x-credits":1,"responses":{"200":{"description":"OK","headers":{"X-Credits-Used":{"$ref":"#/components/headers/X-Credits-Used"},"X-Credits-Remaining":{"$ref":"#/components/headers/X-Credits-Remaining"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpResponse"},"example":{"domain":"example.com","checked_at":"2026-10-25T01:42:10Z","cached":true,"http":{"final_url":"https://www.example.com/","status":200,"https":true,"redirects":[{"url":"http://example.com/","status":301},{"url":"https://example.com/","status":301},{"url":"https://www.example.com/","status":200}],"http3":true,"tls13":true,"ipv6":false,"hsts_preload":false,"headers":{"strict-transport-security":{"status":"pass","value":"max-age=31536000; includeSubDomains"},"content-security-policy":{"status":"missing","value":null},"x-frame-options":{"status":"pass","value":"SAMEORIGIN"},"x-content-type-options":{"status":"pass","value":"nosniff"},"referrer-policy":{"status":"pass","value":"strict-origin-when-cross-origin"},"permissions-policy":{"status":"missing","value":null}}}}}}},"400":{"description":"Bad Request: invalid_domain.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_domain":{"summary":"The domain isn’t valid. Send just the name, like example.com, without https:// or a path.","value":{"error":{"code":"invalid_domain","message":"The domain isn’t valid. Send just the name, like example.com, without https:// or a path."}}}}}}},"401":{"description":"Unauthorized: invalid_key.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_key":{"summary":"The API key is missing, wrong or revoked.","value":{"error":{"code":"invalid_key","message":"The API key is missing, wrong or revoked."}}}}}}},"402":{"description":"Payment Required: out_of_credits.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"out_of_credits":{"summary":"Not enough credits left this period for this call.","value":{"error":{"code":"out_of_credits","message":"Not enough credits left this period for this call."}}}}}}},"403":{"description":"Forbidden: account_blocked, ip_not_allowed, plan_required.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"account_blocked":{"summary":"API access is blocked on this account. Contact us.","value":{"error":{"code":"account_blocked","message":"API access is blocked on this account. Contact us."}}},"ip_not_allowed":{"summary":"The key can’t be used from this IP address (its allowlist).","value":{"error":{"code":"ip_not_allowed","message":"The key can’t be used from this IP address (its allowlist)."}}},"plan_required":{"summary":"fresh=true isn’t on your plan.","value":{"error":{"code":"plan_required","message":"fresh=true isn’t on your plan."}}}}}}},"404":{"description":"Not Found: domain_not_found.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"domain_not_found":{"summary":"The domain doesn’t exist, or has nothing to show for this.","value":{"error":{"code":"domain_not_found","message":"The domain doesn’t exist, or has nothing to show for this."}}}}}}},"429":{"description":"Too Many Requests: rate_limited.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"summary":"Too many requests this second. Wait for Retry-After seconds.","value":{"error":{"code":"rate_limited","message":"Too many requests this second. Wait for Retry-After seconds."}}}}}}},"500":{"description":"Internal Server Error: server_error.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"server_error":{"summary":"Our side failed. You weren’t charged; try again later.","value":{"error":{"code":"server_error","message":"Our side failed. You weren’t charged; try again later."}}}}}}},"503":{"description":"Service Unavailable: api_unavailable, maintenance.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"api_unavailable":{"summary":"The API isn’t open.","value":{"error":{"code":"api_unavailable","message":"The API isn’t open."}}},"maintenance":{"summary":"The API is down for maintenance. Try again shortly.","value":{"error":{"code":"maintenance","message":"The API is down for maintenance. Try again shortly."}}}}}}}}}},"/usage":{"get":{"operationId":"getUsage","summary":"Your plan and this period’s credits","description":"Free: uses no credits. See https://www.cubdomain.com/api/docs/usage.","tags":["Account"],"parameters":[],"x-credits":0,"responses":{"200":{"description":"OK","headers":{"X-Credits-Used":{"$ref":"#/components/headers/X-Credits-Used"},"X-Credits-Remaining":{"$ref":"#/components/headers/X-Credits-Remaining"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usage"},"example":{"plan":"starter","credits":{"limit":5000,"used":1240,"remaining":3760},"period_ends_at":"2026-11-14T00:00:00Z","rate_limit":{"per_second":5},"test_key":false}}}},"401":{"description":"Unauthorized: invalid_key.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_key":{"summary":"The API key is missing, wrong or revoked.","value":{"error":{"code":"invalid_key","message":"The API key is missing, wrong or revoked."}}}}}}},"403":{"description":"Forbidden: account_blocked, ip_not_allowed.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"account_blocked":{"summary":"API access is blocked on this account. Contact us.","value":{"error":{"code":"account_blocked","message":"API access is blocked on this account. Contact us."}}},"ip_not_allowed":{"summary":"The key can’t be used from this IP address (its allowlist).","value":{"error":{"code":"ip_not_allowed","message":"The key can’t be used from this IP address (its allowlist)."}}}}}}},"429":{"description":"Too Many Requests: rate_limited.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"summary":"Too many requests this second. Wait for Retry-After seconds.","value":{"error":{"code":"rate_limited","message":"Too many requests this second. Wait for Retry-After seconds."}}}}}}},"500":{"description":"Internal Server Error: server_error.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"server_error":{"summary":"Our side failed. You weren’t charged; try again later.","value":{"error":{"code":"server_error","message":"Our side failed. You weren’t charged; try again later."}}}}}}},"503":{"description":"Service Unavailable: api_unavailable, maintenance.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"api_unavailable":{"summary":"The API isn’t open.","value":{"error":{"code":"api_unavailable","message":"The API isn’t open."}}},"maintenance":{"summary":"The API is down for maintenance. Try again shortly.","value":{"error":{"code":"maintenance","message":"The API is down for maintenance. Try again shortly."}}}}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Your API key, from your CubDomain account: \"Authorization: Bearer cd_live_…\". 40 characters: cd_live_ or cd_test_ and 32 more."}},"headers":{"X-Credits-Used":{"description":"Credits this call used. Sent with successful answers, and with 402, 404 and 500 answers (0).","schema":{"type":"integer"}},"X-Credits-Remaining":{"description":"Credits left this period, after this call.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests this key has left in the current second.","schema":{"type":"integer"}},"X-Request-Id":{"description":"This request’s id, such as req_8f3a2c71d04b9e65a1f0. Quote it when you contact us.","schema":{"type":"string"}},"Retry-After":{"description":"On 429 only: seconds to wait before trying again.","schema":{"type":"integer"}}},"schemas":{"ReportResponse":{"type":"object","required":["domain","checked_at","cached","score","whois","dns","ssl","hosting","safety","email_security","http","performance","ai_files","incomplete"],"properties":{"domain":{"type":"string","description":"The domain checked, lower-case."},"checked_at":{"type":"string","format":"date-time","description":"When the data was collected (UTC)."},"cached":{"type":"boolean","description":"True when the answer came from our stored report; false for a live check."},"score":{"anyOf":[{"$ref":"#/components/schemas/Score"},{"type":"null"}],"description":"The health score, as on the website. Null when the SSL or site checks didn’t finish."},"whois":{"anyOf":[{"$ref":"#/components/schemas/Whois"},{"type":"null"}],"description":"Registration data from RDAP or WHOIS."},"dns":{"anyOf":[{"$ref":"#/components/schemas/Dns"},{"type":"null"}],"description":"DNS records grouped by type."},"ssl":{"anyOf":[{"$ref":"#/components/schemas/Ssl"},{"type":"null"}],"description":"The certificate the site serves."},"hosting":{"anyOf":[{"$ref":"#/components/schemas/Hosting"},{"type":"null"}],"description":"Where the site’s servers are. From our stored scan only: null for a domain we’ve never analysed."},"safety":{"anyOf":[{"$ref":"#/components/schemas/Safety"},{"type":"null"}],"description":"The WOT community’s rating. From our stored scan only: null for a domain we’ve never analysed or WOT hasn’t rated."},"email_security":{"anyOf":[{"$ref":"#/components/schemas/EmailSecurity"},{"type":"null"}],"description":"How the domain protects its email."},"http":{"anyOf":[{"$ref":"#/components/schemas/Http"},{"type":"null"}],"description":"What a browser gets from the site."},"performance":{"anyOf":[{"$ref":"#/components/schemas/Performance"},{"type":"null"}],"description":"Core Web Vitals from the Chrome UX Report. Only for registrable domains (not subdomains); null when Chrome has no data."},"ai_files":{"anyOf":[{"$ref":"#/components/schemas/AiFiles"},{"type":"null"}],"description":"The files that tell crawlers and AI assistants about the site."},"incomplete":{"type":"array","items":{"type":"string","enum":["score","whois","dns","ssl","hosting","safety","email_security","http","performance","ai_files"]},"description":"Sections left out because they didn’t finish within the timeout. Empty when everything did."}}},"Score":{"type":"object","required":["value","grade","cap","bars","version"],"properties":{"value":{"type":"integer","minimum":0,"maximum":100,"description":"0–100."},"grade":{"type":"string","enum":["A","B","C","D","F"],"description":"A (90+), B (75+), C (60+), D (40+) or F."},"cap":{"type":["string","null"],"description":"Why the score is held lower, such as a blocklisted server or an unsafe rating."},"bars":{"type":"array","items":{"$ref":"#/components/schemas/ScoreBar"},"description":"The parts the score is made of."},"version":{"type":"integer","description":"The scoring method’s version. It goes up when the method changes."}}},"ScoreBar":{"type":"object","required":["key","weight","score"],"properties":{"key":{"type":"string","enum":["ssl","headers","email","performance","standards"],"description":"ssl, headers, email, performance or standards."},"weight":{"type":"integer","description":"Its share of the score, in percent."},"score":{"type":["integer","null"],"minimum":0,"maximum":100,"description":"0–100; null when it couldn’t be worked out."}}},"Whois":{"type":"object","required":["registrar","created","updated","expires","status","name_servers","dnssec","source"],"properties":{"registrar":{"type":["string","null"],"description":"The registrar’s name."},"created":{"type":["string","null"],"format":"date","description":"When the domain was first registered (YYYY-MM-DD)."},"updated":{"type":["string","null"],"format":"date","description":"When the registration last changed."},"expires":{"type":["string","null"],"format":"date","description":"When the registration runs out, unless it’s renewed."},"status":{"type":"array","items":{"type":"string"},"description":"EPP status codes, such as clientTransferProhibited."},"name_servers":{"type":"array","items":{"type":"string"},"description":"The name servers on the registration, lower-case, without the trailing dot."},"dnssec":{"type":["string","null"],"description":"DNSSEC as the registry reports it, such as unsigned or signedDelegation."},"source":{"type":"string","enum":["rdap","whois"],"description":"Where it came from: rdap or whois."}}},"Dns":{"type":"object","required":["a","aaaa","cname","mx","ns","txt","caa","soa"],"properties":{"a":{"type":"array","items":{"type":"string"},"description":"IPv4 addresses."},"aaaa":{"type":"array","items":{"type":"string"},"description":"IPv6 addresses."},"cname":{"type":"array","items":{"type":"string"},"description":"Canonical names, lower-case, without the trailing dot."},"mx":{"type":"array","items":{"$ref":"#/components/schemas/Mx"},"description":"Mail servers, lowest priority number first."},"ns":{"type":"array","items":{"type":"string"},"description":"Name servers, lower-case, without the trailing dot."},"txt":{"type":"array","items":{"type":"string"},"description":"TXT records, with the quotes taken off and long records joined."},"caa":{"type":"array","items":{"type":"string"},"description":"CAA records: which certificate authorities may issue for the domain."},"soa":{"type":["string","null"],"description":"The SOA record’s data."}}},"Mx":{"type":"object","required":["host","pri"],"properties":{"host":{"type":"string","description":"The mail server."},"pri":{"type":"integer","description":"Its priority: lower is tried first."}}},"Ssl":{"type":"object","required":["status","valid","issuer","subject","valid_from","valid_to","days_left","problem","names"],"properties":{"status":{"type":"string","enum":["valid","expiring","expired","not_trusted","unknown","none"],"description":"valid, expiring (14 days or fewer), expired, not_trusted, unknown or none (no certificate)."},"valid":{"type":"boolean","description":"True when browsers accept it: the status is valid or expiring."},"issuer":{"type":["string","null"],"description":"Who issued it: the organisation, or its common name."},"subject":{"type":["string","null"],"description":"The common name it was issued for."},"valid_from":{"type":["string","null"],"format":"date","description":"The first day it’s valid."},"valid_to":{"type":["string","null"],"format":"date","description":"The last day it’s valid."},"days_left":{"type":["integer","null"],"description":"Days until it expires; negative once it has."},"problem":{"type":["string","null"],"enum":["name","self-signed",null],"description":"Why it isn’t trusted: name (it doesn’t cover the domain) or self-signed."},"names":{"type":"array","items":{"type":"string"},"description":"The names it covers (subject alternative names)."}}},"Hosting":{"type":"object","required":["country","asn","network","countries","servers"],"properties":{"country":{"type":["string","null"],"description":"The country hosting most of the servers (ISO 3166 code)."},"asn":{"type":["string","null"],"description":"The first server’s network number, such as AS64500."},"network":{"type":["string","null"],"description":"The first server’s network name."},"countries":{"type":"integer","description":"How many countries the servers are in."},"servers":{"type":"array","items":{"$ref":"#/components/schemas/Server"},"description":"Every server address, with its location and network."}}},"Server":{"type":"object","required":["ip","country","country_name","city","asn","network"],"properties":{"ip":{"type":"string","description":"The address."},"country":{"type":["string","null"],"description":"ISO 3166 country code."},"country_name":{"type":["string","null"],"description":"The country’s name."},"city":{"type":["string","null"],"description":"The city."},"asn":{"type":["string","null"],"description":"The network number."},"network":{"type":["string","null"],"description":"The network name."}}},"Safety":{"type":"object","required":["source","status","reputation","confidence","child_safety_reputation","categories"],"properties":{"source":{"type":"string","enum":["wot"],"description":"Always wot."},"status":{"type":"string","description":"safe, caution, unsafe or not_rated; any other word is WOT’s own, in lower case."},"reputation":{"type":["integer","null"],"minimum":0,"maximum":100,"description":"Safety reputation, 0–100."},"confidence":{"type":["integer","null"],"minimum":0,"maximum":100,"description":"How sure WOT is of it, 0–100."},"child_safety_reputation":{"type":["integer","null"],"minimum":0,"maximum":100,"description":"Child safety reputation, 0–100."},"categories":{"type":"array","items":{"type":"string"},"description":"WOT’s categories for the site."}}},"EmailSecurity":{"type":"object","required":["spf","dmarc","dmarc_policy","dkim","mta_sts","bimi","mx_count"],"properties":{"spf":{"$ref":"#/components/schemas/Check","description":"SPF: which servers may send mail for the domain."},"dmarc":{"$ref":"#/components/schemas/Check","description":"DMARC: what receivers should do with mail that fails SPF and DKIM."},"dmarc_policy":{"type":["string","null"],"enum":["reject","quarantine","none",null],"description":"The DMARC policy: reject, quarantine or none. Null without exactly one DMARC record."},"dkim":{"$ref":"#/components/schemas/Check","description":"DKIM: pass when a key is found under a common selector; none when none is."},"mta_sts":{"$ref":"#/components/schemas/Check","description":"MTA-STS: whether other servers must use TLS to deliver mail."},"bimi":{"$ref":"#/components/schemas/Check","description":"BIMI: a brand logo for mail clients. Optional."},"mx_count":{"type":["integer","null"],"description":"How many MX records the domain has."}}},"Check":{"type":"object","required":["status","value"],"properties":{"status":{"type":"string","enum":["pass","warning","fail","missing","none","unknown"],"description":"pass, warning, fail, missing, none or unknown."},"value":{"type":["string","null"],"description":"The record or header found, or a note. Null when there’s nothing to show."}}},"Http":{"type":"object","required":["final_url","status","https","redirects","http3","tls13","ipv6","hsts_preload","headers"],"properties":{"final_url":{"type":["string","null"],"format":"uri","description":"Where the redirects end."},"status":{"type":["integer","null"],"description":"The HTTP status of the final answer."},"https":{"type":["boolean","null"],"description":"Whether the final address uses HTTPS."},"redirects":{"type":"array","items":{"$ref":"#/components/schemas/Hop"},"description":"Every step from http://{domain}/, the final one included."},"http3":{"type":["boolean","null"],"description":"Whether the site offers HTTP/3."},"tls13":{"type":["boolean","null"],"description":"Whether the site supports TLS 1.3."},"ipv6":{"type":["boolean","null"],"description":"Whether the site can be reached over IPv6."},"hsts_preload":{"type":["boolean","null"],"description":"Whether the domain is on the browsers’ HSTS preload list."},"headers":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/Check","description":"A check’s result."},"description":"The security headers, by lower-case name: strict-transport-security, content-security-policy, x-frame-options, x-content-type-options, referrer-policy, permissions-policy. Empty when the site couldn’t be reached."}}},"Hop":{"type":"object","required":["url","status"],"properties":{"url":{"type":"string","format":"uri","description":"The address asked for."},"status":{"type":"integer","description":"Its HTTP status."}}},"Performance":{"type":"object","required":["source","origin","phone","desktop"],"properties":{"source":{"type":"string","enum":["chrome_ux_report"],"description":"Always chrome_ux_report."},"origin":{"type":["string","null"],"format":"uri","description":"The origin Chrome measured."},"phone":{"anyOf":[{"$ref":"#/components/schemas/PageSpeed"},{"type":"null"}],"description":"Visits on phones."},"desktop":{"anyOf":[{"$ref":"#/components/schemas/PageSpeed"},{"type":"null"}],"description":"Visits on desktop computers."}}},"PageSpeed":{"type":"object","required":["lcp_ms","inp_ms","cls"],"properties":{"lcp_ms":{"type":["number","null"],"description":"Largest Contentful Paint, in milliseconds."},"inp_ms":{"type":["number","null"],"description":"Interaction to Next Paint, in milliseconds."},"cls":{"type":["number","null"],"description":"Cumulative Layout Shift."}}},"AiFiles":{"type":"object","required":["robots_txt","llms_txt","llms_full_txt","sitemaps","ai_crawlers"],"properties":{"robots_txt":{"type":["boolean","null"],"description":"Whether there is a robots.txt."},"llms_txt":{"type":["boolean","null"],"description":"Whether there is an llms.txt."},"llms_full_txt":{"type":["boolean","null"],"description":"Whether there is an llms-full.txt."},"sitemaps":{"type":"array","items":{"type":"string"},"description":"The sitemaps robots.txt lists."},"ai_crawlers":{"type":"object","additionalProperties":{"type":"string","enum":["allowed","partly","blocked"]},"description":"What robots.txt allows each AI crawler (GPTBot, ClaudeBot, Google-Extended, PerplexityBot, CCBot, Applebot-Extended): allowed, partly or blocked."}}},"WhoisResponse":{"type":"object","required":["domain","checked_at","cached","whois"],"properties":{"domain":{"type":"string","description":"The domain checked, lower-case."},"checked_at":{"type":"string","format":"date-time","description":"When the data was collected (UTC)."},"cached":{"type":"boolean","description":"True when the answer came from our stored report; false for a live check."},"whois":{"$ref":"#/components/schemas/Whois","description":"Registration data from RDAP or WHOIS."}}},"DnsResponse":{"type":"object","required":["domain","checked_at","cached","dns"],"properties":{"domain":{"type":"string","description":"The domain checked, lower-case."},"checked_at":{"type":"string","format":"date-time","description":"When the data was collected (UTC)."},"cached":{"type":"boolean","description":"True when the answer came from our stored report; false for a live check."},"dns":{"$ref":"#/components/schemas/Dns","description":"DNS records grouped by type."}}},"SslResponse":{"type":"object","required":["domain","checked_at","cached","ssl"],"properties":{"domain":{"type":"string","description":"The domain checked, lower-case."},"checked_at":{"type":"string","format":"date-time","description":"When the data was collected (UTC)."},"cached":{"type":"boolean","description":"True when the answer came from our stored report; false for a live check."},"ssl":{"$ref":"#/components/schemas/Ssl","description":"The certificate the site serves."}}},"EmailSecurityResponse":{"type":"object","required":["domain","checked_at","cached","email_security"],"properties":{"domain":{"type":"string","description":"The domain checked, lower-case."},"checked_at":{"type":"string","format":"date-time","description":"When the data was collected (UTC)."},"cached":{"type":"boolean","description":"True when the answer came from our stored report; false for a live check."},"email_security":{"$ref":"#/components/schemas/EmailSecurity","description":"How the domain protects its email."}}},"HttpResponse":{"type":"object","required":["domain","checked_at","cached","http"],"properties":{"domain":{"type":"string","description":"The domain checked, lower-case."},"checked_at":{"type":"string","format":"date-time","description":"When the data was collected (UTC)."},"cached":{"type":"boolean","description":"True when the answer came from our stored report; false for a live check."},"http":{"$ref":"#/components/schemas/Http","description":"What a browser gets from the site."}}},"Usage":{"type":"object","required":["plan","credits","period_ends_at","rate_limit","test_key"],"properties":{"plan":{"type":"string","enum":["free","starter","pro","business"],"description":"Your plan: free, starter, pro or business."},"credits":{"type":"object","required":["limit","used","remaining"],"properties":{"limit":{"type":"integer","description":"Credits a period on your plan."},"used":{"type":"integer","description":"Used so far."},"remaining":{"type":"integer","description":"Left until the period ends."}},"description":"This period’s credits, shared by all your keys."},"period_ends_at":{"type":"string","format":"date-time","description":"When the credits reset (UTC)."},"rate_limit":{"type":"object","required":["per_second"],"properties":{"per_second":{"type":"integer","description":"Requests a second, per key."}},"description":"Your plan’s rate limit."},"test_key":{"type":"boolean","description":"Whether this call used a test key."}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["invalid_domain","invalid_parameter","invalid_key","out_of_credits","account_blocked","ip_not_allowed","plan_required","domain_not_found","rate_limited","server_error","api_unavailable","maintenance"],"description":"A stable code to check in your code."},"message":{"type":"string","description":"What went wrong, in plain English. It may change; don’t match on it."}}}}}}}}