{"openapi":"3.1.0","info":{"title":"XGM API","description":"Free, read-only checks for domains, email authentication and IPs. No key needed. Rate limit: 30 requests per minute per client, plus the per-tool limits listed at https://xgm.ro/api.","version":"1.0.0"},"servers":[{"url":"https://xgm.ro"}],"paths":{"/api/v1/email-security/{domain}":{"get":{"tags":["XGM API v1"],"summary":"SPF and DMARC check","description":"SPF (every include resolved, DNS lookups counted against the limit of 10) and DMARC (policy, report authorisation) for a domain, with findings and DNS fixes. DKIM, MTA-STS, TLS-RPT and BIMI are checked on the web tool.","operationId":"email_security_api_v1_email_security__domain__get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(json|text)$"},{"type":"null"}],"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header.","title":"Format"},"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailSecurityResult"}}}},"400":{"description":"Invalid or refused target","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"429":{"description":"Rate limited; see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"502":{"description":"Upstream check failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dmarc/{domain}":{"get":{"tags":["XGM API v1"],"summary":"DMARC policy check (deprecated)","description":"Deprecated: use `/api/v1/email-security/{domain}`, which returns this result as `dmarc`. Looks up `_dmarc.<domain>` (falling back to the organizational domain), checks external report authorisation and returns findings with fixes.","operationId":"dmarc_api_v1_dmarc__domain__get","deprecated":true,"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(json|text)$"},{"type":"null"}],"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header.","title":"Format"},"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DmarcResult"}}}},"400":{"description":"Invalid or refused target","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"429":{"description":"Rate limited; see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"502":{"description":"Upstream check failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/spf/{domain}":{"get":{"tags":["XGM API v1"],"summary":"SPF record check (deprecated)","description":"Deprecated: use `/api/v1/email-security/{domain}`, which returns this result as `spf`. Resolves the SPF record and every include/redirect, counts DNS lookups (RFC 7208 limit 10) and returns findings.","operationId":"spf_api_v1_spf__domain__get","deprecated":true,"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(json|text)$"},{"type":"null"}],"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header.","title":"Format"},"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpfResult"}}}},"400":{"description":"Invalid or refused target","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"429":{"description":"Rate limited; see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"502":{"description":"Upstream check failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dns/{domain}":{"get":{"tags":["XGM API v1"],"summary":"DNS records","description":"A, AAAA, MX, NS, TXT and CNAME records from the XGM resolver.","operationId":"dns_records_api_v1_dns__domain__get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(json|text)$"},{"type":"null"}],"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header.","title":"Format"},"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsResult"}}}},"400":{"description":"Invalid or refused target","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"429":{"description":"Rate limited; see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"502":{"description":"Upstream check failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ssl/{domain}":{"get":{"tags":["XGM API v1"],"summary":"TLS certificate","description":"Connects to `<domain>:443` and returns the certificate, protocol and cipher.","operationId":"ssl_check_api_v1_ssl__domain__get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(json|text)$"},{"type":"null"}],"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header.","title":"Format"},"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebResult"}}}},"400":{"description":"Invalid or refused target","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"429":{"description":"Rate limited; see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"502":{"description":"Upstream check failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/http-headers/{domain}":{"get":{"tags":["XGM API v1"],"summary":"HTTP security headers","description":"Requests `https://<domain>`, follows redirects and returns the response headers and which security headers are present.","operationId":"http_headers_api_v1_http_headers__domain__get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(json|text)$"},{"type":"null"}],"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header.","title":"Format"},"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebResult"}}}},"400":{"description":"Invalid or refused target","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"429":{"description":"Rate limited; see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"502":{"description":"Upstream check failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/redirect/{domain}":{"get":{"tags":["XGM API v1"],"summary":"Redirect chain","description":"Starts at `http://<domain>` and returns every redirect hop and the final URL.","operationId":"redirect_api_v1_redirect__domain__get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(json|text)$"},{"type":"null"}],"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header.","title":"Format"},"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebResult"}}}},"400":{"description":"Invalid or refused target","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"429":{"description":"Rate limited; see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"502":{"description":"Upstream check failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/redirects/{domain}":{"get":{"tags":["XGM API v1"],"summary":"Redirect chain (deprecated)","description":"Deprecated: renamed to `/api/v1/redirect/{domain}` with the same response.","operationId":"redirects_api_v1_redirects__domain__get","deprecated":true,"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(json|text)$"},{"type":"null"}],"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header.","title":"Format"},"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebResult"}}}},"400":{"description":"Invalid or refused target","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"429":{"description":"Rate limited; see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"502":{"description":"Upstream check failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/whois/{domain}":{"get":{"tags":["XGM API v1"],"summary":"WHOIS summary","description":"Registrar, dates, status, name servers and abuse contact from the registry: RDAP first, port 43 WHOIS as fallback (`source` in the summary says which).","operationId":"whois_api_v1_whois__domain__get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(json|text)$"},{"type":"null"}],"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header.","title":"Format"},"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhoisResult"}}}},"400":{"description":"Invalid or refused target","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"429":{"description":"Rate limited; see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"502":{"description":"Upstream check failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/blacklist/{target}":{"get":{"tags":["XGM API v1"],"summary":"DNS blocklists","description":"Checks an IPv4 address against 48 DNS blocklists; for a domain, its A and MX addresses (up to 5) on the IP lists and the name on 12 domain lists.","operationId":"blacklist_api_v1_blacklist__target__get","parameters":[{"name":"target","in":"path","required":true,"schema":{"type":"string","title":"Target"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(json|text)$"},{"type":"null"}],"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header.","title":"Format"},"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlacklistResult"}}}},"400":{"description":"Invalid or refused target","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"429":{"description":"Rate limited; see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"502":{"description":"Upstream check failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ip/{ip}":{"get":{"tags":["XGM API v1"],"summary":"IP address lookup","description":"Version, reverse DNS, network (ASN) and approximate location (ipwho.is via the XGM server) for an IPv4 or IPv6 address, or a hostname's first address.","operationId":"ip_info_api_v1_ip__ip__get","parameters":[{"name":"ip","in":"path","required":true,"schema":{"type":"string","title":"Ip"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(json|text)$"},{"type":"null"}],"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header.","title":"Format"},"description":"Force the response format. Default: JSON, or plain text for curl/wget/HTTPie without an Accept header."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IpResult"}}}},"400":{"description":"Invalid or refused target","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"429":{"description":"Rate limited; see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"502":{"description":"Upstream check failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"BlacklistResult":{"properties":{"api_version":{"type":"string","const":"1","title":"Api Version","default":"1"},"tool":{"type":"string","title":"Tool"},"target":{"type":"string","title":"Target"},"checked_at":{"type":"string","title":"Checked At"},"web_url":{"type":"string","title":"Web Url","description":"The same check on xgm.ro"},"ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip","description":"First IPv4 address checked (the input, or the domain's first A record)"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"targets":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Targets","description":"Every IPv4 address checked and where it came from (at most 5)"},"listed_count":{"type":"integer","title":"Listed Count"},"error_count":{"type":"integer","title":"Error Count"},"zones":{"items":{"$ref":"#/components/schemas/BlacklistZone"},"type":"array","title":"Zones"}},"type":"object","required":["tool","target","checked_at","web_url","ip","domain","targets","listed_count","error_count","zones"],"title":"BlacklistResult"},"BlacklistZone":{"properties":{"zone":{"type":"string","title":"Zone"},"name":{"type":"string","title":"Name","description":"Name of the list"},"type":{"type":"string","title":"Type","description":"ip: an IPv4 address was checked; domain: the domain name was checked"},"checked":{"type":"string","title":"Checked","description":"The IPv4 address or domain looked up on this list"},"source":{"type":"string","title":"Source","description":"Where the checked address came from: input, A record, MX <host> or domain"},"delist":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delist","description":"The list operator's lookup or removal page, when known"},"listed":{"type":"boolean","title":"Listed"},"refused":{"type":"boolean","title":"Refused","description":"The list refused the query (127.255.255.x or the list's own refusal code); not a listing"},"error":{"type":"boolean","title":"Error","description":"The list did not answer or the DNS lookup failed; the result is unknown, not \"not listed\""},"response":{"items":{"type":"string"},"type":"array","title":"Response"},"reason":{"items":{"type":"string"},"type":"array","title":"Reason","description":"TXT reason published by the list for a listing, when available"}},"type":"object","required":["zone","name","type","checked","source","delist","listed","refused","error","response","reason"],"title":"BlacklistZone"},"DmarcResult":{"properties":{"api_version":{"type":"string","const":"1","title":"Api Version","default":"1"},"tool":{"type":"string","title":"Tool"},"target":{"type":"string","title":"Target"},"checked_at":{"type":"string","title":"Checked At"},"web_url":{"type":"string","title":"Web Url","description":"The same check on xgm.ro"},"verdict":{"type":"string","title":"Verdict"},"tone":{"type":"string","enum":["success","warning","danger","info"],"title":"Tone"},"findings":{"items":{"$ref":"#/components/schemas/FindingModel"},"type":"array","title":"Findings"},"lookup_name":{"type":"string","title":"Lookup Name"},"record":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Record"},"policy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy"},"inherited_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inherited From"}},"type":"object","required":["tool","target","checked_at","web_url","verdict","tone","findings","lookup_name"],"title":"DmarcResult"},"DmarcSection":{"properties":{"verdict":{"type":"string","title":"Verdict"},"tone":{"type":"string","enum":["success","warning","danger","info"],"title":"Tone"},"lookup_name":{"type":"string","title":"Lookup Name"},"record":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Record"},"policy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy"},"inherited_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inherited From"},"findings":{"items":{"$ref":"#/components/schemas/FindingModel"},"type":"array","title":"Findings"}},"type":"object","required":["verdict","tone","lookup_name","findings"],"title":"DmarcSection"},"DnsResult":{"properties":{"api_version":{"type":"string","const":"1","title":"Api Version","default":"1"},"tool":{"type":"string","title":"Tool"},"target":{"type":"string","title":"Target"},"checked_at":{"type":"string","title":"Checked At"},"web_url":{"type":"string","title":"Web Url","description":"The same check on xgm.ro"},"records":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Records"},"errors":{"additionalProperties":{"type":"string"},"type":"object","title":"Errors","description":"Record types whose lookup failed (timeout, no_nameservers, dns_error)"}},"type":"object","required":["tool","target","checked_at","web_url","records"],"title":"DnsResult"},"EmailSecurityResult":{"properties":{"api_version":{"type":"string","const":"1","title":"Api Version","default":"1"},"tool":{"type":"string","title":"Tool"},"target":{"type":"string","title":"Target"},"checked_at":{"type":"string","title":"Checked At"},"web_url":{"type":"string","title":"Web Url","description":"The same check on xgm.ro"},"verdict":{"type":"string","title":"Verdict"},"tone":{"type":"string","enum":["success","warning","danger","info"],"title":"Tone"},"findings":{"items":{"$ref":"#/components/schemas/FindingModel"},"type":"array","title":"Findings"},"spf":{"$ref":"#/components/schemas/SpfSection"},"dmarc":{"$ref":"#/components/schemas/DmarcSection"}},"type":"object","required":["tool","target","checked_at","web_url","verdict","tone","findings","spf","dmarc"],"title":"EmailSecurityResult","description":"SPF and DMARC in one response. Top-level findings are both sections' findings with \"spf-\"/\"dmarc-\" id prefixes."},"ErrorModel":{"properties":{"detail":{"type":"string","title":"Detail"}},"type":"object","required":["detail"],"title":"ErrorModel"},"FindingModel":{"properties":{"id":{"type":"string","title":"Id"},"severity":{"type":"string","enum":["critical","warning","info","passed"],"title":"Severity"},"title":{"type":"string","title":"Title"},"explanation":{"type":"string","title":"Explanation"},"fix":{"anyOf":[{"$ref":"#/components/schemas/FixModel"},{"type":"null"}]},"learn_more":{"anyOf":[{"$ref":"#/components/schemas/LinkModel"},{"type":"null"}]}},"type":"object","required":["id","severity","title","explanation"],"title":"FindingModel"},"FixModel":{"properties":{"label":{"type":"string","title":"Label"},"code":{"type":"string","title":"Code"}},"type":"object","required":["label","code"],"title":"FixModel"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IpResult":{"properties":{"api_version":{"type":"string","const":"1","title":"Api Version","default":"1"},"tool":{"type":"string","title":"Tool"},"target":{"type":"string","title":"Target"},"checked_at":{"type":"string","title":"Checked At"},"web_url":{"type":"string","title":"Web Url","description":"The same check on xgm.ro"},"ip":{"type":"string","title":"Ip"},"version":{"type":"integer","title":"Version"},"hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hostname"},"is_global":{"type":"boolean","title":"Is Global"},"geo":{"additionalProperties":true,"type":"object","title":"Geo"}},"type":"object","required":["tool","target","checked_at","web_url","ip","version","hostname","is_global","geo"],"title":"IpResult"},"LinkModel":{"properties":{"href":{"type":"string","title":"Href"},"label":{"type":"string","title":"Label"}},"type":"object","required":["href","label"],"title":"LinkModel"},"SpfResult":{"properties":{"api_version":{"type":"string","const":"1","title":"Api Version","default":"1"},"tool":{"type":"string","title":"Tool"},"target":{"type":"string","title":"Target"},"checked_at":{"type":"string","title":"Checked At"},"web_url":{"type":"string","title":"Web Url","description":"The same check on xgm.ro"},"verdict":{"type":"string","title":"Verdict"},"tone":{"type":"string","enum":["success","warning","danger","info"],"title":"Tone"},"findings":{"items":{"$ref":"#/components/schemas/FindingModel"},"type":"array","title":"Findings"},"record":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Record"},"lookups":{"type":"integer","title":"Lookups"},"void_lookups":{"type":"integer","title":"Void Lookups"},"include_tree":{"type":"string","title":"Include Tree"}},"type":"object","required":["tool","target","checked_at","web_url","verdict","tone","findings","lookups","void_lookups","include_tree"],"title":"SpfResult"},"SpfSection":{"properties":{"verdict":{"type":"string","title":"Verdict"},"tone":{"type":"string","enum":["success","warning","danger","info"],"title":"Tone"},"record":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Record"},"lookups":{"type":"integer","title":"Lookups"},"void_lookups":{"type":"integer","title":"Void Lookups"},"include_tree":{"type":"string","title":"Include Tree"},"findings":{"items":{"$ref":"#/components/schemas/FindingModel"},"type":"array","title":"Findings"}},"type":"object","required":["verdict","tone","lookups","void_lookups","include_tree","findings"],"title":"SpfSection"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebResult":{"properties":{"api_version":{"type":"string","const":"1","title":"Api Version","default":"1"},"tool":{"type":"string","title":"Tool"},"target":{"type":"string","title":"Target"},"checked_at":{"type":"string","title":"Checked At"},"web_url":{"type":"string","title":"Web Url","description":"The same check on xgm.ro"},"final_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Final Url"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"},"redirects":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Redirects"},"security_headers":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Security Headers"},"headers":{"additionalProperties":{"type":"string"},"type":"object","title":"Headers"},"tls":{"additionalProperties":true,"type":"object","title":"Tls"}},"type":"object","required":["tool","target","checked_at","web_url","final_url","status_code","redirects","security_headers","headers","tls"],"title":"WebResult"},"WhoisResult":{"properties":{"api_version":{"type":"string","const":"1","title":"Api Version","default":"1"},"tool":{"type":"string","title":"Tool"},"target":{"type":"string","title":"Target"},"checked_at":{"type":"string","title":"Checked At"},"web_url":{"type":"string","title":"Web Url","description":"The same check on xgm.ro"},"server":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server"},"summary":{"additionalProperties":true,"type":"object","title":"Summary"}},"type":"object","required":["tool","target","checked_at","web_url","server","summary"],"title":"WhoisResult"}}}}