{"openapi":"3.1.0","info":{"title":"netray API","license":{"name":"MIT","identifier":"MIT"},"version":"0.30.0"},"paths":{"/api/v1/asn/{n}":{"get":{"tags":["ip"],"summary":"What is known about an autonomous system.","operationId":"asn","parameters":[{"name":"n","in":"path","description":"The AS number, digits only","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The AS's classification","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsnLookupResponse"}}}},"400":{"description":"Not a number","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The IP module is off","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/catalogue":{"get":{"tags":["reference"],"summary":"Every check of the catalogue, in file order.","operationId":"catalogue_handler","responses":{"200":{"description":"The catalogue","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/dns/authcompare":{"get":{"tags":["dns"],"summary":"The job of `POST /dns/authcompare` over the query language in `q`.","operationId":"dns_authcompare_get","parameters":[{"name":"q","in":"query","description":"The query: a domain, then record types, `@server` names or addresses and `+flags`","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The recursive and the authoritative lookups of the domain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsAuthCompareResult"}},"text/event-stream":{"schema":{"$ref":"#/components/schemas/DnsAuthCompareEvent"}}}},"400":{"description":"Missing or unparsable q, invalid domain, record type or server, or a query the DNS policy refuses","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"A server address in a blocked range","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, or too many DNS jobs of this caller at once","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The DNS module is off, or no resolver could be built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["dns"],"summary":"The recursive answer against the authoritative one, queried from the domain's name servers.","operationId":"dns_authcompare","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostQueryRequest"}}},"required":true},"responses":{"200":{"description":"The recursive and the authoritative lookups of the domain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsAuthCompareResult"}},"text/event-stream":{"schema":{"$ref":"#/components/schemas/DnsAuthCompareEvent"}}}},"400":{"description":"Malformed body, invalid domain, record type or server, or a query the DNS policy refuses","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"A server address in a blocked range","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, or too many DNS jobs of this caller at once","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The DNS module is off, or no resolver could be built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/dns/check":{"get":{"tags":["dns"],"summary":"The check of `POST /dns/check` over the query language in `q`: the domain is its first token.","operationId":"dns_check_get","parameters":[{"name":"q","in":"query","description":"The query: a domain","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The DNS section of a run: its checks, evidence blocks and the key it replays under","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsCheckResult"}}}},"400":{"description":"Missing or unparsable q, or a blank domain or an IP address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, or too many DNS jobs of this caller at once","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The DNS module is off","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["dns"],"summary":"Runs the DNS module's ten health checks on a domain and answers them as one JSON object,\nwhatever the `Accept` header.","operationId":"dns_check","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsCheckRequest"}}},"required":true},"responses":{"200":{"description":"The DNS section of a run: its checks, evidence blocks and the key it replays under","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsCheckResult"}}}},"400":{"description":"Malformed body, or a blank domain or an IP address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, or too many DNS jobs of this caller at once","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The DNS module is off","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/dns/compare":{"get":{"tags":["dns"],"summary":"The job of `POST /dns/compare` over the query language in `q`.","operationId":"dns_compare_get","parameters":[{"name":"q","in":"query","description":"The query: a domain, then record types, `@server` names or addresses and `+flags`","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The lookups of the domain per transport","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsCompareResult"}},"text/event-stream":{"schema":{"$ref":"#/components/schemas/DnsCompareEvent"}}}},"400":{"description":"Missing or unparsable q, invalid domain, record type or server, or a query the DNS policy refuses","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"A server address in a blocked range","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, or too many DNS jobs of this caller at once","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The DNS module is off, or no resolver could be built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["dns"],"summary":"The same query over UDP, TCP, DNS-over-TLS and DNS-over-HTTPS, to compare the transports.","operationId":"dns_compare","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostQueryRequest"}}},"required":true},"responses":{"200":{"description":"The lookups of the domain per transport","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsCompareResult"}},"text/event-stream":{"schema":{"$ref":"#/components/schemas/DnsCompareEvent"}}}},"400":{"description":"Malformed body, invalid domain, record type or server, or a query the DNS policy refuses","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"A server address in a blocked range","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, or too many DNS jobs of this caller at once","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The DNS module is off, or no resolver could be built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/dns/dnssec":{"get":{"tags":["dns"],"summary":"The job of `POST /dns/dnssec` over the query language in `q`: the domain.","operationId":"dns_dnssec_get","parameters":[{"name":"q","in":"query","description":"The query: a domain","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The levels of the chain of trust","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsDnssecResult"}},"text/event-stream":{"schema":{"$ref":"#/components/schemas/DnsDnssecEvent"}}}},"400":{"description":"Missing or unparsable q, or invalid domain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, or too many DNS jobs of this caller at once","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The DNS module is off, or no resolver could be built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["dns"],"summary":"The DNSSEC chain of trust of a name, one level per zone from the root.","operationId":"dns_dnssec","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnssecRequest"}}},"required":true},"responses":{"200":{"description":"The levels of the chain of trust","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsDnssecResult"}},"text/event-stream":{"schema":{"$ref":"#/components/schemas/DnsDnssecEvent"}}}},"400":{"description":"Malformed body or invalid domain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, or too many DNS jobs of this caller at once","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The DNS module is off, or no resolver could be built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/dns/parse":{"post":{"tags":["dns"],"summary":"Parses a query string: its tokens with byte ranges, the completions at the cursor, and the\nparsed query or the reason it does not parse.","operationId":"dns_parse","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsParseRequest"}}},"required":true},"responses":{"200":{"description":"Tokens, completions and the parsed query or its error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsParseAnswer"}}}},"400":{"description":"Malformed body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/dns/query":{"get":{"tags":["dns"],"summary":"The job of `POST /dns/query` over the dig-like query language in `q`. A routing flag (`+trace`,\n`+compare`, `+auth`, `+check`) redirects to that job's path with the same `q`.","operationId":"dns_query_get","parameters":[{"name":"q","in":"query","description":"The query: a domain, then record types, `@server` names or addresses and `+flags`","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The lookups of the domain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsQueryResult"}},"text/event-stream":{"schema":{"$ref":"#/components/schemas/DnsQueryEvent"}}}},"307":{"description":"A routing flag (+trace, +compare, +auth, +check): the same q on that job's path"},"400":{"description":"Missing or unparsable q, invalid domain, record type or server, or a query the DNS policy refuses","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"A server address in a blocked range","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, or too many DNS jobs of this caller at once","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The DNS module is off, or no resolver could be built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["dns"],"summary":"Resolves a domain over the configured resolvers: one batch per provider and record type.\nWith `Accept: text/event-stream` the same events arrive as they complete.","operationId":"dns_query","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostQueryRequest"}}},"required":true},"responses":{"200":{"description":"The lookups of the domain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsQueryResult"}},"text/event-stream":{"schema":{"$ref":"#/components/schemas/DnsQueryEvent"}}}},"400":{"description":"Malformed body, invalid domain, record type or server, or a query the DNS policy refuses","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"A server address in a blocked range","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, or too many DNS jobs of this caller at once","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The DNS module is off, or no resolver could be built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/dns/record-types":{"get":{"tags":["dns"],"summary":"The record types a query may ask for; the blocked and internal ones are left out.","operationId":"dns_record_types","responses":{"200":{"description":"The record types","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsRecordTypes"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/dns/results/{key}":{"get":{"tags":["dns"],"summary":"The collected result of a DNS job, under the `cache_key` of its `done`, for up to an hour.","operationId":"dns_result","parameters":[{"name":"key","in":"path","description":"The 12-character lowercase hex `cache_key` of a job's `done`","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The stored result: the job's mode, its query and its collected result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsCachedResult"}}}},"400":{"description":"The key is not 12 lowercase hex characters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No result under this key: expired or never stored","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/dns/servers":{"get":{"tags":["dns"],"summary":"The predefined DNS providers with their transports, and the group aliases over them.","operationId":"dns_servers","responses":{"200":{"description":"Providers and groups","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsServerCatalogue"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/dns/trace":{"get":{"tags":["dns"],"summary":"The job of `POST /dns/trace` over the query language in `q`: the domain and its first record type.","operationId":"dns_trace_get","parameters":[{"name":"q","in":"query","description":"The query: a domain, then a record type (A when none)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The hops of the delegation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsTraceResult"}},"text/event-stream":{"schema":{"$ref":"#/components/schemas/DnsTraceEvent"}}}},"400":{"description":"Missing or unparsable q, invalid domain or record type","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, or too many DNS jobs of this caller at once","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The DNS module is off, or no resolver could be built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["dns"],"summary":"The delegation path of a name from the root servers, one hop per server asked.","operationId":"dns_trace","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TraceRequest"}}},"required":true},"responses":{"200":{"description":"The hops of the delegation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsTraceResult"}},"text/event-stream":{"schema":{"$ref":"#/components/schemas/DnsTraceEvent"}}}},"400":{"description":"Malformed body, invalid domain or record type","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, or too many DNS jobs of this caller at once","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The DNS module is off, or no resolver could be built","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/domains/{domain}":{"get":{"tags":["history"],"summary":"A domain's latest entry.","operationId":"domain_entry","parameters":[{"name":"domain","in":"path","description":"The domain, any form the suite accepts","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The latest entry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntryView"}}}},"400":{"description":"Not a domain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No entry for this domain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The history could not be read","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The history is switched off","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/domains/{domain}/diff":{"get":{"tags":["history"],"summary":"What changed in a domain's latest entry against its predecessor.","operationId":"domain_changes","parameters":[{"name":"domain","in":"path","description":"The domain, any form the suite accepts","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The changes of the latest entry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiffView"}}}},"400":{"description":"Not a domain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No entry for this domain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The history could not be read","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The history is switched off","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/domains/{domain}/history":{"get":{"tags":["history"],"summary":"A domain's entries, newest first.","operationId":"domain_history","parameters":[{"name":"domain","in":"path","description":"The domain, any form the suite accepts","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The entries, newest first","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryResponse"}}}},"400":{"description":"Not a domain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No entry for this domain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The history could not be read","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The history is switched off","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/domains/{domain}/runs":{"post":{"tags":["runs"],"summary":"Start a fresh run of a domain and answer with it; takes no body.","operationId":"start_run","parameters":[{"name":"domain","in":"path","description":"The domain to check","required":true,"schema":{"type":"string"}},{"name":"dkim_selectors","in":"query","description":"Custom DKIM selectors, comma-separated: 1 to 5, each 1-63 of `[A-Za-z0-9-]`; empty means\nnone. A run with selectors is never joined, never answered from the history and never\nrecorded (`recorded: not_stored`).","required":false,"schema":{"type":"string"},"example":"google,selector1"}],"responses":{"200":{"description":"The run and how the history recorded it; with `Accept: text/event-stream`, `section` events as they arrive, then one `done` event carrying the same answer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunAnswer"}},"text/event-stream":{"schema":{"$ref":"#/components/schemas/RunSectionEvent"}}}},"400":{"description":"Not a valid domain, or an invalid `dkim_selectors` list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Throttled, budget spent, rate limited or no free run slot","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A prefetch does not start a run","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/email/inspect":{"post":{"tags":["email"],"summary":"The mail posture of a domain: twelve categories, the evidence and a summary. With\n`Accept: text/event-stream` the same events arrive as they complete.","operationId":"email_inspect","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailInspectRequest"}}},"required":true},"responses":{"200":{"description":"The inspection of the domain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailInspectResult"}},"text/event-stream":{"schema":{"$ref":"#/components/schemas/SseEvent"}}}},"400":{"description":"Malformed body, unknown field, invalid domain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The inspection ended without a summary","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The email module is off, or every inspection slot is taken","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/entries/{id}":{"get":{"tags":["history"],"summary":"One entry by id.","operationId":"entry_read","parameters":[{"name":"id","in":"path","description":"The entry id, eight letters or digits","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The entry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntryView"}}}},"404":{"description":"Not an entry id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"410":{"description":"No entry with this id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The history could not be read","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The history is switched off","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/entries/{id}/diff":{"get":{"tags":["history"],"summary":"What changed in one entry against its predecessor.","operationId":"entry_changes","parameters":[{"name":"id","in":"path","description":"The entry id, eight letters or digits","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The changes of the entry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiffView"}}}},"404":{"description":"Not an entry id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"410":{"description":"No entry with this id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The history could not be read","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The history is switched off","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/http/inspect":{"post":{"tags":["http"],"summary":"The security headers, redirects and content policy of a URL.","operationId":"http_inspect","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpInspectRequest"}}},"required":true},"responses":{"200":{"description":"The inspection of the URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpInspectResponse"}}}},"400":{"description":"Malformed body, unknown field, invalid URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The target is not a public address (`TARGET_BLOCKED`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The HTTP module is off, the host did not resolve, or the request timed out","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/ip":{"get":{"tags":["ip"],"summary":"The caller's address, or one field of it; with `?ip=`, that address instead.","operationId":"caller","parameters":[{"name":"field","in":"query","description":"Answer this one field as text/plain, with a trailing newline","required":false,"schema":{"$ref":"#/components/schemas/CallerField"}},{"name":"ip","in":"query","description":"Answer for this address instead of the caller's","required":false,"schema":{"type":"string"}},{"name":"dns","in":"query","description":"Reverse DNS: `true` or `1` (default) looks it up, anything else leaves the hostname null","required":false,"schema":{"type":"string"}},{"name":"lang","in":"query","description":"Language tag of the localized location names: up to 16 ASCII letters, digits and `-`","required":false,"schema":{"type":"string"}},{"name":"fields","in":"query","description":"Comma-separated top-level keys to keep in a structured answer","required":false,"schema":{"type":"string"}},{"name":"format","in":"query","description":"Render the answer in this form; without it, an `Accept` of yaml, toml or csv decides","required":false,"schema":{"$ref":"#/components/schemas/Format"}}],"responses":{"200":{"description":"The lookup; with `?field`, that one value as text/plain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ifconfig"}},"application/yaml":{"schema":{"type":"string"}},"application/toml":{"schema":{"type":"string"}},"text/csv":{"schema":{"type":"string"}},"text/plain":{"schema":{"type":"string"}}}},"400":{"description":"Unknown field or format, malformed `lang`, or an `ip` that is malformed or non-global","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The IP module is off","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/ip/batch":{"post":{"tags":["ip"],"summary":"Up to `batch_max_size` addresses in one request.","operationId":"batch","parameters":[{"name":"dns","in":"query","description":"Reverse DNS per address: `true` or `1` looks it up; without it the hostname is null","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequest"}}},"required":true},"responses":{"200":{"description":"One item per address, in order","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchResponse"}}}},"400":{"description":"Malformed body, no addresses, or `BATCH_TOO_MANY`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The IP module is off","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/ip/diff":{"post":{"tags":["ip"],"summary":"Two addresses side by side.","operationId":"compare","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiffRequest"}}},"required":true},"responses":{"200":{"description":"Both lookups, part by part, with whether the parts are equal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiffResponse"}}}},"400":{"description":"Malformed body, malformed or non-global address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The IP module is off","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/ip/range/{cidr}":{"get":{"tags":["ip"],"summary":"What is known about a CIDR prefix.","operationId":"range","parameters":[{"name":"cidr","in":"path","description":"A CIDR prefix; the slash may be sent as `%2F`","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The prefix's classification","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RangeResponse"}}}},"400":{"description":"Malformed or private, loopback or link-local prefix","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The IP module is off","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/ip/{address}":{"get":{"tags":["ip"],"summary":"One global address, or one field of it.","operationId":"address","parameters":[{"name":"address","in":"path","description":"An IPv4 or IPv6 address","required":true,"schema":{"type":"string"}},{"name":"field","in":"query","description":"Answer this one field as text/plain, with a trailing newline","required":false,"schema":{"$ref":"#/components/schemas/AddressField"}},{"name":"dns","in":"query","description":"Reverse DNS: `true` or `1` (default) looks it up, anything else leaves the hostname null","required":false,"schema":{"type":"string"}},{"name":"lang","in":"query","description":"Language tag of the localized location names: up to 16 ASCII letters, digits and `-`","required":false,"schema":{"type":"string"}},{"name":"fields","in":"query","description":"Comma-separated top-level keys to keep in a structured answer","required":false,"schema":{"type":"string"}},{"name":"format","in":"query","description":"Render the answer in this form; without it, an `Accept` of yaml, toml or csv decides","required":false,"schema":{"$ref":"#/components/schemas/Format"}}],"responses":{"200":{"description":"The address's lookup; with `?field`, that one value as text/plain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ifconfig"}},"application/yaml":{"schema":{"type":"string"}},"application/toml":{"schema":{"type":"string"}},"text/csv":{"schema":{"type":"string"}},"text/plain":{"schema":{"type":"string"}}}},"400":{"description":"Malformed or non-global address, caller-only or unknown field, unknown format or malformed `lang`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The IP module is off","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/meta":{"get":{"tags":["reference"],"summary":"Version, profiles and the limits this deployment runs with.","operationId":"meta_handler","responses":{"200":{"description":"Deployment metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Meta"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/profiles/{n}":{"get":{"tags":["reference"],"summary":"One scoring profile.","operationId":"profile_handler","parameters":[{"name":"n","in":"path","description":"Profile version, an integer","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The profile","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Profile"}}}},"400":{"description":"Not an integer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown profile version","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/tls/inspect":{"post":{"tags":["tls"],"summary":"The certificate chain, validation and quality of a host on one port.","operationId":"tls_inspect","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TlsInspectRequest"}}},"required":true},"responses":{"200":{"description":"The inspection of the host on the port","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TlsInspectResponse"}}}},"400":{"description":"Malformed body, unknown field, invalid host or port","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The target is not a public address (`TARGET_BLOCKED`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request body over the 8 KiB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The TLS module is off, the host did not resolve, or the handshake timed out","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"AddressField":{"type":"string","description":"The fields of `?field=` that describe an address.","enum":["ip","asn","country","city","region","timezone","latitude","longitude","isp","location","network","host","cidr"]},"AdmissionMeta":{"type":"object","required":["client_budget_per_hour","domain_run_slots"],"properties":{"client_budget_per_hour":{"type":"integer","format":"int32","minimum":0},"domain_run_slots":{"type":"integer","format":"int32","minimum":0}}},"Agreement":{"type":"string","description":"Whether the servers asked for one record type answered alike.","enum":["agree","diverge","single","unmeasured"]},"AnswerOutcome":{"type":"string","description":"What one server answered for one record type.","enum":["answered","no_records","nxdomain","unmeasured"]},"ApiLimits":{"type":"object","required":["per_ip_per_minute","per_ip_burst"],"properties":{"per_ip_burst":{"type":"integer","format":"int32","minimum":0},"per_ip_per_minute":{"type":"integer","format":"int32","minimum":0}}},"AsnLookupResponse":{"type":"object","required":["asn","is_anycast"],"properties":{"asn":{"type":"integer","format":"int32","description":"ASN number.","example":15169,"minimum":0},"category":{"type":["string","null"],"description":"ASN category from ipverse/as-metadata.","example":"hosting"},"is_anycast":{"type":"boolean","description":"Whether this ASN is known to be anycast.","example":false},"network_role":{"type":["string","null"],"description":"Network role from ipverse/as-metadata.","example":"tier1_transit"},"org":{"type":["string","null"],"description":"Organization name from MaxMind ASN database.","example":"Google LLC"}}},"BatchItem":{"oneOf":[{"type":"object","required":["address","result"],"properties":{"address":{"type":"string","description":"The address as requested."},"result":{"$ref":"#/components/schemas/Ifconfig"}}},{"type":"object","required":["address","error"],"properties":{"address":{"type":"string","description":"The address as requested."},"error":{"$ref":"#/components/schemas/ErrorInfo"}}}],"description":"The lookup of one address, or why it was not answered."},"BatchRequest":{"type":"object","description":"The addresses of a batch lookup.","required":["addresses"],"properties":{"addresses":{"type":"array","items":{"type":"string"},"description":"At most `batch_max_size` addresses, answered in this order."}},"additionalProperties":false},"BatchResponse":{"type":"object","description":"One answer per requested address, in request order.","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/BatchItem"}}}},"Block":{"type":"object","description":"One block of evidence.","required":["id","title","shape"],"properties":{"id":{"$ref":"#/components/schemas/BlockId"},"shape":{"$ref":"#/components/schemas/Shape"},"title":{"type":"string"}}},"BlockChange":{"type":"object","required":["block","kind"],"properties":{"block":{"$ref":"#/components/schemas/BlockId"},"kind":{"$ref":"#/components/schemas/BlockChangeKind"}}},"BlockChangeKind":{"oneOf":[{"type":"string","enum":["added"]},{"type":"string","enum":["removed"]},{"type":"object","description":"`items` by shape: fields and table, `~ key` per changed key or row, `- key` per removed\nand `+ key` per added one; records, a signed descriptor per added or removed record;\nchain, the changed positions as strings; tree, the changed node paths; text, none.","required":["changed"],"properties":{"changed":{"type":"object","description":"`items` by shape: fields and table, `~ key` per changed key or row, `- key` per removed\nand `+ key` per added one; records, a signed descriptor per added or removed record;\nchain, the changed positions as strings; tree, the changed node paths; text, none.","required":["items"],"properties":{"items":{"type":"array","items":{"type":"string"}}}}}}]},"BlockId":{"type":"string","examples":["tls.chain@192.0.2.1:443"]},"Browser":{"type":"object","required":["family","version"],"properties":{"family":{"type":"string","example":"Chrome"},"major":{"type":["string","null"],"example":"120"},"minor":{"type":["string","null"],"example":"0"},"patch":{"type":["string","null"]},"version":{"type":"string","example":"120.0"}}},"CaaInfo":{"type":"object","required":["records","issuewild_present"],"properties":{"issuer_allowed":{"type":["boolean","null"]},"issuewild_present":{"type":"boolean"},"records":{"type":"array","items":{"type":"string"}}}},"CacheControlDirectives":{"type":"object","required":["public","private","no_store","no_cache","must_revalidate","immutable"],"properties":{"immutable":{"type":"boolean"},"max_age":{"type":["integer","null"],"format":"int64","minimum":0},"must_revalidate":{"type":"boolean"},"no_cache":{"type":"boolean"},"no_store":{"type":"boolean"},"private":{"type":"boolean"},"public":{"type":"boolean"}}},"CachingReport":{"type":"object","required":["directives","vary"],"properties":{"age":{"type":["integer","null"],"format":"int64","minimum":0},"cache_control":{"type":["string","null"]},"directives":{"$ref":"#/components/schemas/CacheControlDirectives"},"etag":{"type":["string","null"]},"last_modified":{"type":["string","null"]},"vary":{"type":"array","items":{"type":"string"}}}},"CallerField":{"type":"string","description":"The fields of `?field=` on the caller's own address: the address fields and what the request carries.","enum":["ip","asn","country","city","region","timezone","latitude","longitude","isp","location","network","tcp","user_agent","host","headers","cidr","all"]},"CatalogueResponse":{"type":"object","required":["checks"],"properties":{"checks":{"type":"array","items":{"$ref":"#/components/schemas/CheckSpec"}}}},"Category":{"type":"string","enum":["certificate","protocol","configuration"]},"CdnReport":{"type":"object","required":["indicators"],"properties":{"cache_status":{"type":["string","null"]},"detected":{"type":["string","null"]},"indicators":{"type":"array","items":{"type":"string"}}}},"CertInfo":{"type":"object","description":"Parsed certificate info.","required":["position","subject","issuer","sans","serial","not_before","not_after","days_remaining","key_type","key_size","signature_algorithm","fingerprint_sha256","fingerprint_sha1","lifetime_days","is_expired","is_self_signed","cert_policy"],"properties":{"ca_issuers_url":{"type":["string","null"],"description":"CA Issuers URL from AIA extension (OID 1.3.6.1.5.5.7.48.2)."},"cert_policy":{"type":"string","description":"Certificate policy classification: \"EV\", \"OV\", \"DV\", or \"unknown\"."},"days_remaining":{"type":"integer","format":"int64"},"fingerprint_sha1":{"type":"string"},"fingerprint_sha256":{"type":"string"},"is_expired":{"type":"boolean"},"is_self_signed":{"type":"boolean"},"issuer":{"type":"string"},"key_size":{"type":"integer","format":"int32","minimum":0},"key_type":{"type":"string"},"lifetime_days":{"type":"integer","format":"int64"},"not_after":{"type":"string"},"not_before":{"type":"string"},"ocsp_url":{"type":["string","null"],"description":"OCSP responder URL from AIA extension (OID 1.3.6.1.5.5.7.48.1)."},"position":{"type":"string"},"sans":{"type":"array","items":{"type":"string"}},"serial":{"type":"string"},"signature_algorithm":{"type":"string"},"subject":{"type":"string"}}},"ChainFinding":{"type":"object","description":"A validation finding for a DNSSEC chain level.","required":["severity","message"],"properties":{"message":{"type":"string"},"severity":{"type":"string"}}},"ChainLevel":{"type":"object","description":"A single zone level in the DNSSEC chain.","required":["level","zone","servers_queried","dnskey_records","ds_records","rrsig_records","findings","latency_ms","is_final"],"properties":{"dnskey_records":{"type":"array","items":{"$ref":"#/components/schemas/DnsRecord"}},"ds_records":{"type":"array","items":{"$ref":"#/components/schemas/DnsRecord"}},"findings":{"type":"array","items":{"$ref":"#/components/schemas/ChainFinding"}},"is_final":{"type":"boolean"},"latency_ms":{"type":"number","format":"double"},"level":{"type":"integer","minimum":0},"rrsig_records":{"type":"array","items":{"$ref":"#/components/schemas/DnsRecord"}},"servers_queried":{"type":"integer","minimum":0},"zone":{"type":"string"}}},"ChangeClass":{"type":"string","enum":["fixed","improved","new","worse","now_applicable","no_longer_applicable","into_not_tested","out_of_not_tested","into_not_measured","out_of_not_measured","added","removed","added_by_release","removed_by_release"]},"CheckChange":{"type":"object","required":["id","class"],"properties":{"class":{"$ref":"#/components/schemas/ChangeClass"},"from":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Status"}]},"id":{"$ref":"#/components/schemas/CheckId"},"to":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Status"}]}}},"CheckId":{"type":"string","examples":["tls.chain_trusted"]},"CheckResult":{"type":"object","required":["category","verdict","title","detail","sub_checks"],"properties":{"category":{"$ref":"#/components/schemas/EmailCategory"},"detail":{"type":"string"},"enrichment":{"type":"array","items":{"$ref":"#/components/schemas/IpEnrichment"}},"sub_checks":{"type":"array","items":{"$ref":"#/components/schemas/SubCheck"}},"title":{"type":"string"},"verdict":{"$ref":"#/components/schemas/Verdict"}}},"CheckSpec":{"type":"object","description":"One catalogue entry.","required":["id","protocol","title","finding","impact","fix_hint","fix_owner","severity","source","guide","short"],"properties":{"finding":{"type":"string"},"fix_hint":{"type":"string"},"fix_owner":{"$ref":"#/components/schemas/FixOwner"},"guide":{"type":"string"},"id":{"$ref":"#/components/schemas/CheckId"},"impact":{"type":"string"},"protocol":{"$ref":"#/components/schemas/Protocol"},"severity":{"$ref":"#/components/schemas/Severity"},"short":{"type":"string"},"source":{"type":"string"},"title":{"type":"string"}}},"CloudInfo":{"type":"object","required":["provider"],"properties":{"provider":{"type":"string","example":"aws"},"region":{"type":["string","null"],"example":"us-east-1"},"service":{"type":["string","null"],"example":"EC2"}}},"Completion":{"type":"object","required":["label","detail","category"],"properties":{"category":{"type":"string","description":"Completion category: `record_type`, `server`, `flag`."},"detail":{"type":"string"},"label":{"type":"string"}}},"ConsistencyMismatch":{"type":"object","required":["field","values"],"properties":{"field":{"type":"string"},"values":{"type":"object","description":"Per-IP values, keyed by IP address string.","additionalProperties":{"type":"string"},"propertyNames":{"type":"string"}}}},"ConsistencyResult":{"type":"object","required":["certificates_match","tls_versions_match","cipher_suites_match"],"properties":{"certificates_match":{"type":"boolean"},"cipher_suites_match":{"type":"boolean"},"mismatches":{"type":"array","items":{"$ref":"#/components/schemas/ConsistencyMismatch"}},"tls_versions_match":{"type":"boolean"}}},"CookieEntry":{"type":"object","required":["name","secure","httponly"],"properties":{"domain":{"type":["string","null"]},"expires":{"type":["string","null"]},"httponly":{"type":"boolean"},"name":{"type":"string"},"path":{"type":["string","null"]},"samesite":{"type":["string","null"]},"secure":{"type":"boolean"}}},"CorsReport":{"type":"object","required":["allows_any_origin","reflects_origin","allows_credentials","status","message"],"properties":{"allows_any_origin":{"type":"boolean"},"allows_credentials":{"type":"boolean"},"error":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProbeError"}]},"message":{"type":"string"},"reflects_origin":{"type":"boolean"},"status":{"$ref":"#/components/schemas/HttpCheckStatus"}}},"CspReport":{"type":"object","required":["status","enforced","report_only","directives","issues"],"properties":{"directives":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}},"enforced":{"type":"boolean"},"issues":{"type":"array","items":{"type":"string"}},"report_only":{"type":"boolean"},"status":{"$ref":"#/components/schemas/HttpCheckStatus"}}},"CtInfo":{"type":"object","required":["sct_count","scts"],"properties":{"sct_count":{"type":"integer","minimum":0},"scts":{"type":"array","items":{"$ref":"#/components/schemas/SctEntry"}}}},"Device":{"type":"object","required":["family"],"properties":{"brand":{"type":["string","null"]},"family":{"type":"string","example":"Other"},"model":{"type":["string","null"]}}},"Diff":{"type":"object","required":["checks","evidence","grade","engine_changed"],"properties":{"checks":{"type":"array","items":{"$ref":"#/components/schemas/CheckChange"}},"engine_changed":{"type":"boolean","description":"Whether the two runs' engine versions differ."},"evidence":{"type":"array","items":{"$ref":"#/components/schemas/BlockChange"}},"grade":{"$ref":"#/components/schemas/GradeChange"}}},"DiffRequest":{"type":"object","required":["a","b"],"properties":{"a":{"type":"string","description":"First IP address to compare.","example":"8.8.8.8"},"b":{"type":"string","description":"Second IP address to compare.","example":"1.1.1.1"}}},"DiffResponse":{"type":"object","description":"The two answers of a diff, one entry per top-level field of `Ifconfig`.","required":["ip","location","network","tcp","user_agent"],"properties":{"ip":{"$ref":"#/components/schemas/IpDiff"},"location":{"$ref":"#/components/schemas/LocationDiff"},"network":{"$ref":"#/components/schemas/NetworkDiff"},"tcp":{"$ref":"#/components/schemas/TcpDiff"},"user_agent":{"$ref":"#/components/schemas/UserAgentDiff"}}},"DiffView":{"type":"object","required":["entry_id"],"properties":{"diff":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Diff"}]},"entry_id":{"type":"string"},"predecessor_id":{"type":["string","null"]}}},"DnsAuthCompareDone":{"type":"object","description":"Summary of an authcompare job.","required":["request_id","total_queries","duration_ms","warnings","auth_servers"],"properties":{"auth_servers":{"type":"array","items":{"type":"string"},"description":"Discovered authoritative nameservers, e.g. [\"ns1.example.com (1.2.3.4)\"]."},"cache_key":{"type":["string","null"]},"duration_ms":{"type":"integer","format":"int64","minimum":0},"request_id":{"type":"string"},"total_queries":{"type":"integer","format":"int32","minimum":0},"warnings":{"type":"array","items":{"type":"string"}}}},"DnsAuthCompareEvent":{"oneOf":[{"$ref":"#/components/schemas/DnsBatch"},{"$ref":"#/components/schemas/DnsErrorEvent"},{"$ref":"#/components/schemas/DnsEnrichmentEvent"},{"$ref":"#/components/schemas/DnsJobSummary","description":"The job's summary, emitted by API v1 before `done`; the job never sends it."},{"$ref":"#/components/schemas/DnsAuthCompareDone"}],"description":"An event of an authcompare job."},"DnsAuthCompareResult":{"type":"object","description":"The events of the job, collected.","required":["batches","errors","enrichment","done","summary"],"properties":{"batches":{"type":"array","items":{"$ref":"#/components/schemas/DnsBatch"}},"done":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DnsAuthCompareDone","description":"`null` when the stream ended before the job finished."}]},"enrichment":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DnsEnrichmentEvent"}]},"errors":{"type":"array","items":{"$ref":"#/components/schemas/DnsErrorEvent"}},"summary":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DnsJobSummary","description":"`null` until the job is done."}]}}},"DnsBatch":{"type":"object","description":"The answers for one record type: one per record type, transport or source.\n\nSerialises with the human-readable record fields injected (`*_human`, `*_explain`,\n`txt_string`); [`DnsBatch::cache_value`] is the same without them.","required":["request_id","record_type","lookups","completed","total"],"properties":{"completed":{"type":"integer","format":"int32","minimum":0},"lookups":{"$ref":"#/components/schemas/DnsLookups"},"record_type":{"type":"string"},"request_id":{"type":"string"},"source":{"type":["string","null"],"description":"Source of this batch: \"recursive\" or \"authoritative\" (authcompare only)."},"total":{"type":"integer","format":"int32","minimum":0},"transport":{"type":["string","null"],"description":"Transport used for this batch (compare only)."}}},"DnsCachedJob":{"oneOf":[{"$ref":"#/components/schemas/DnsQueryResult"},{"$ref":"#/components/schemas/DnsCompareResult"},{"$ref":"#/components/schemas/DnsAuthCompareResult"},{"$ref":"#/components/schemas/DnsTraceResult"},{"$ref":"#/components/schemas/DnsDnssecResult"},{"$ref":"#/components/schemas/DnsCheckResult"}],"description":"The collected result of a job, whichever job it was."},"DnsCachedResult":{"type":"object","description":"A stored job result and what produced it.","required":["key","mode","query","result"],"properties":{"key":{"type":"string","description":"The 12-character hex key from the job's `done`."},"mode":{"type":"string","description":"The job: `query`, `compare`, `authcompare`, `trace`, `dnssec` or `check`."},"query":{"type":"string","description":"The `q` of the GET, or the `domain` of the POST body."},"result":{"$ref":"#/components/schemas/DnsCachedJob","description":"The job's collected result, as the job answered it."}}},"DnsChainEvent":{"type":"object","description":"One zone level of a DNSSEC chain.","required":["request_id","level"],"properties":{"level":{"$ref":"#/components/schemas/ChainLevel"},"request_id":{"type":"string"}}},"DnsCheckEntry":{"type":"object","description":"One check of the section; findings and evidence are always present, empty or not.","required":["id","status","findings","evidence"],"properties":{"evidence":{"type":"array","items":{"$ref":"#/components/schemas/BlockId"}},"findings":{"type":"array","items":{"type":"string"}},"id":{"$ref":"#/components/schemas/CheckId"},"status":{"$ref":"#/components/schemas/Status"}}},"DnsCheckRequest":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"The domain to check"}}},"DnsCheckResult":{"type":"object","description":"The DNS module's section of one run: what `GET /domains/{domain}/runs` streams as `section`,\nwith the key its result is stored under.","required":["protocol","outcome","checks","blocks"],"properties":{"blocks":{"type":"array","items":{"$ref":"#/components/schemas/Block"}},"cache_key":{"type":["string","null"],"description":"The 12-character hex key `GET /dns/results/{key}` replays this result under."},"checks":{"type":"array","items":{"$ref":"#/components/schemas/DnsCheckEntry"}},"outcome":{"$ref":"#/components/schemas/SectionKind"},"protocol":{"$ref":"#/components/schemas/Protocol"},"reason":{"type":["string","null"]}}},"DnsCloudInfo":{"type":"object","description":"Cloud provider metadata from the enrichment API.","properties":{"provider":{"type":["string","null"]},"region":{"type":["string","null"]},"service":{"type":["string","null"]}}},"DnsCompareDone":{"type":"object","description":"Summary of a compare job.","required":["request_id","total_queries","duration_ms","warnings","transports"],"properties":{"cache_key":{"type":["string","null"]},"duration_ms":{"type":"integer","format":"int64","minimum":0},"request_id":{"type":"string"},"total_queries":{"type":"integer","format":"int32","minimum":0},"transports":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"}}}},"DnsCompareEvent":{"oneOf":[{"$ref":"#/components/schemas/DnsBatch"},{"$ref":"#/components/schemas/DnsErrorEvent"},{"$ref":"#/components/schemas/DnsEnrichmentEvent"},{"$ref":"#/components/schemas/DnsJobSummary","description":"The job's summary, emitted by API v1 before `done`; the job never sends it."},{"$ref":"#/components/schemas/DnsCompareDone"}],"description":"An event of a compare job."},"DnsCompareResult":{"type":"object","description":"The events of the job, collected.","required":["batches","errors","enrichment","done","summary"],"properties":{"batches":{"type":"array","items":{"$ref":"#/components/schemas/DnsBatch"}},"done":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DnsCompareDone","description":"`null` when the stream ended before the job finished."}]},"enrichment":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DnsEnrichmentEvent"}]},"errors":{"type":"array","items":{"$ref":"#/components/schemas/DnsErrorEvent"}},"summary":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DnsJobSummary","description":"`null` until the job is done."}]}}},"DnsContext":{"type":"object","required":["resolved_ips"],"properties":{"caa":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CaaInfo"}]},"lookup_errors":{"type":"array","items":{"type":"string"},"description":"The lookups that failed or got no definitive answer: \"caa\", \"tlsa\", \"https\"."},"resolved_ips":{"type":"array","items":{"type":"string"}}}},"DnsDnssecDone":{"type":"object","description":"Summary of a dnssec job.","required":["request_id","duration_ms","levels"],"properties":{"cache_key":{"type":["string","null"]},"duration_ms":{"type":"integer","format":"int64","minimum":0},"levels":{"type":"integer","minimum":0},"request_id":{"type":"string"}}},"DnsDnssecEvent":{"oneOf":[{"$ref":"#/components/schemas/DnsChainEvent"},{"$ref":"#/components/schemas/DnsErrorEvent"},{"$ref":"#/components/schemas/DnsDnssecDone"}],"description":"An event of a dnssec job."},"DnsDnssecResult":{"type":"object","description":"The events of a dnssec job, collected.","required":["levels","errors","done"],"properties":{"done":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DnsDnssecDone","description":"`null` when the stream ended before the job finished."}]},"errors":{"type":"array","items":{"$ref":"#/components/schemas/DnsErrorEvent"}},"levels":{"type":"array","items":{"$ref":"#/components/schemas/DnsChainEvent"}}}},"DnsDuration":{"type":"object","required":["secs","nanos"],"properties":{"nanos":{"type":"integer","format":"int32","minimum":0},"secs":{"type":"integer","format":"int64","minimum":0}}},"DnsEnrichmentEvent":{"type":"object","description":"Enrichment of the IP addresses the job found.","required":["request_id","enrichments"],"properties":{"enrichments":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/DnsIpInfo"},"propertyNames":{"type":"string"}},"request_id":{"type":"string"}}},"DnsErrorEvent":{"type":"object","description":"A non-fatal error of a job, e.g. one resolver failing.","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"DnsHopEvent":{"type":"object","description":"One delegation level of a trace.","required":["request_id","hop"],"properties":{"hop":{"$ref":"#/components/schemas/TraceHop"},"request_id":{"type":"string"}}},"DnsIpInfo":{"type":"object","description":"Metadata about a single IP address from the enrichment API.","properties":{"asn":{"type":["integer","null"],"format":"int32","minimum":0},"cloud":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DnsCloudInfo"}]},"is_c2":{"type":"boolean"},"is_datacenter":{"type":"boolean"},"is_spamhaus":{"type":"boolean"},"is_tor":{"type":"boolean"},"is_vpn":{"type":"boolean"},"network_role":{"type":["string","null"],"description":"ASN network role from ipverse/as-metadata (e.g. \"Midsize Transit\", \"Access Provider\")."},"org":{"type":["string","null"]},"type":{"type":["string","null"],"description":"IP classification: \"cloud\", \"datacenter\", \"residential\", \"vpn\", etc."}}},"DnsJobSummary":{"type":"object","description":"A batch job condensed: per record type who agreed, per server how it fared.","required":["record_types","lookups","agree","diverge","single","unmeasured","types","servers"],"properties":{"agree":{"type":"integer","format":"int32","minimum":0},"diverge":{"type":"integer","format":"int32","minimum":0},"lookups":{"type":"integer","format":"int32","minimum":0},"record_types":{"type":"integer","format":"int32","minimum":0},"servers":{"type":"array","items":{"$ref":"#/components/schemas/DnsServerSummary"},"description":"Sorted by source, transport, server."},"single":{"type":"integer","format":"int32","minimum":0},"types":{"type":"array","items":{"$ref":"#/components/schemas/DnsTypeComparison"},"description":"Sorted by record type."},"unmeasured":{"type":"integer","format":"int32","minimum":0}}},"DnsLookup":{"type":"object","description":"One server's answer to one query.","required":["query","name_server","result"],"properties":{"name_server":{"type":"string","description":"The server, e.g. `udp:192.0.2.1:53`."},"query":{"$ref":"#/components/schemas/DnsQuery"},"result":{"$ref":"#/components/schemas/DnsLookupResult"}}},"DnsLookupError":{"anyOf":[{"type":"string","enum":["QueryRefused","ServerFailure","Timeout","NoRecordsFound","CancelledError","RuntimePanicError"]},{"type":"object","required":["ResolveError"],"properties":{"ResolveError":{"type":"object","required":["reason"],"properties":{"reason":{"type":"string"}}}}},{"type":"object","required":["ProtoError"],"properties":{"ProtoError":{"type":"object","required":["reason"],"properties":{"reason":{"type":"string"}}}}}]},"DnsLookupRecord":{"type":"object","required":["name","type","ttl","data"],"properties":{"data":{"type":"object","description":"The record data by type name: a string for A, AAAA, NS, CNAME, PTR and every\nauthoritative record, an object of the type's fields for the others.","additionalProperties":{"$ref":"#/components/schemas/DnsRData"},"propertyNames":{"type":"string"}},"name":{"type":"string"},"ttl":{"type":"integer","format":"int32","minimum":0},"type":{"type":"string"}}},"DnsLookupResult":{"oneOf":[{"type":"object","required":["Response"],"properties":{"Response":{"$ref":"#/components/schemas/DnsResponse"}}},{"type":"object","required":["NxDomain"],"properties":{"NxDomain":{"$ref":"#/components/schemas/DnsNxDomain"}}},{"type":"object","required":["Error"],"properties":{"Error":{"$ref":"#/components/schemas/DnsLookupError"}}}],"description":"A response, an NXDOMAIN or NODATA answer, or an error, as a single-key object."},"DnsLookups":{"type":"object","description":"All lookups of one batch.","required":["lookups"],"properties":{"lookups":{"type":"array","items":{"$ref":"#/components/schemas/DnsLookup"}}}},"DnsMeta":{"type":"object","required":["per_ip_per_minute","per_ip_burst","per_target_per_minute","per_target_burst","global_per_minute","global_burst","per_ip_max_streams"],"properties":{"global_burst":{"type":"integer","format":"int32","minimum":0},"global_per_minute":{"type":"integer","format":"int32","minimum":0},"per_ip_burst":{"type":"integer","format":"int32","minimum":0},"per_ip_max_streams":{"type":"integer","format":"int32","minimum":0},"per_ip_per_minute":{"type":"integer","format":"int32","minimum":0},"per_target_burst":{"type":"integer","format":"int32","minimum":0},"per_target_per_minute":{"type":"integer","format":"int32","minimum":0}}},"DnsNxDomain":{"type":"object","required":["response_time"],"properties":{"referral":{"type":["boolean","null"]},"response_code":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DnsResponseCode"}]},"response_time":{"$ref":"#/components/schemas/DnsDuration"}}},"DnsParseAnswer":{"type":"object","description":"Tokens and completions of a query string, with the parsed query or the reason it does not\nparse.","required":["tokens","completions"],"properties":{"completions":{"type":"array","items":{"$ref":"#/components/schemas/Completion"}},"error":{"type":["string","null"]},"query":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DnsParsedQuery"}]},"tokens":{"type":"array","items":{"$ref":"#/components/schemas/TokenInfo"}}}},"DnsParseRequest":{"type":"object","description":"A query string to parse.","required":["input"],"properties":{"cursor_pos":{"type":["integer","null"],"description":"Cursor byte offset within the input (defaults to end of input).","minimum":0},"input":{"type":"string","description":"The query input string to tokenize."}}},"DnsParsedQuery":{"type":"object","description":"A query string as the parser reads it.","required":["domain","record_types","servers","dnssec","warnings"],"properties":{"dnssec":{"type":"boolean"},"domain":{"type":"string"},"record_types":{"type":"array","items":{"type":"string"}},"servers":{"type":"array","items":{"type":"string"},"description":"Servers as `google`, `system` or `ip:port`; empty means the configured defaults."},"transport":{"type":["string","null"],"description":"`udp`, `tcp`, `tls` or `https`, when the query names one."},"warnings":{"type":"array","items":{"type":"string"}}}},"DnsQuery":{"type":"object","required":["name","record_type"],"properties":{"name":{"type":"string"},"record_type":{"type":"string"}}},"DnsQueryDone":{"type":"object","description":"Summary of a query job.","required":["request_id","total_queries","duration_ms","warnings","transport","dnssec"],"properties":{"cache_key":{"type":["string","null"],"description":"Cache key for retrieving this result via permalink."},"degraded_providers":{"type":"array","items":{"type":"string"},"description":"Providers skipped due to open circuit breakers during this query."},"dnssec":{"type":"boolean","description":"Whether DNSSEC mode was requested."},"duration_ms":{"type":"integer","format":"int64","minimum":0},"request_id":{"type":"string"},"total_queries":{"type":"integer","format":"int32","minimum":0},"transport":{"type":"string","description":"Transport used for this query (e.g., \"udp\", \"tls\")."},"warnings":{"type":"array","items":{"type":"string"}}}},"DnsQueryEvent":{"oneOf":[{"$ref":"#/components/schemas/DnsBatch"},{"$ref":"#/components/schemas/DnsErrorEvent"},{"$ref":"#/components/schemas/DnsEnrichmentEvent"},{"$ref":"#/components/schemas/DnsJobSummary","description":"The job's summary, emitted by API v1 before `done`; the job never sends it."},{"$ref":"#/components/schemas/DnsQueryDone"}],"description":"An event of a query job."},"DnsQueryResult":{"type":"object","description":"The events of the job, collected.","required":["batches","errors","enrichment","done","summary"],"properties":{"batches":{"type":"array","items":{"$ref":"#/components/schemas/DnsBatch"}},"done":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DnsQueryDone","description":"`null` when the stream ended before the job finished."}]},"enrichment":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DnsEnrichmentEvent"}]},"errors":{"type":"array","items":{"$ref":"#/components/schemas/DnsErrorEvent"}},"summary":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DnsJobSummary","description":"`null` until the job is done."}]}}},"DnsRData":{"anyOf":[{"type":"string"},{"type":"object","additionalProperties":{"$ref":"#/components/schemas/DnsRDataField"}}]},"DnsRDataField":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"type":"array","items":{"$ref":"#/components/schemas/DnsRDataField"}},{"type":"object","additionalProperties":{"$ref":"#/components/schemas/DnsRDataField"}}]},"DnsRecord":{"type":"object","required":["name","ttl","record_type","rdata"],"properties":{"name":{"type":"string"},"rdata":{"type":"string"},"record_type":{"type":"string"},"ttl":{"type":"integer","format":"int32","minimum":0}}},"DnsRecordDetail":{"type":"object","description":"One record of a server's answer.","required":["name","type","ttl","data"],"properties":{"data":{"type":"string","description":"The record data in zone-file form."},"name":{"type":"string"},"soa_serial_age_days":{"type":["integer","null"],"format":"int64","description":"Days since the date an SOA serial in `YYYYMMDDnn` form names."},"ttl":{"type":"integer","format":"int32","minimum":0},"type":{"type":"string"}}},"DnsRecordTypes":{"type":"object","description":"The record types a query may ask for.","required":["record_types"],"properties":{"record_types":{"type":"array","items":{"$ref":"#/components/schemas/RecordTypeInfo"}}}},"DnsResponse":{"type":"object","required":["records","response_time"],"properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/DnsLookupRecord"}},"response_time":{"$ref":"#/components/schemas/DnsDuration"},"valid_until":{"type":["string","null"]}}},"DnsResponseCode":{"anyOf":[{"type":"string"},{"type":"integer"}]},"DnsServerAnswer":{"type":"object","description":"One server's answer to one record type.","required":["server","address","transport","outcome","records"],"properties":{"address":{"type":"string","description":"The server's socket address."},"error":{"type":["string","null"],"description":"Why an unmeasured answer is no answer."},"name":{"type":["string","null"]},"outcome":{"$ref":"#/components/schemas/AnswerOutcome"},"records":{"type":"array","items":{"$ref":"#/components/schemas/DnsRecordDetail"},"description":"Sorted by type, then data."},"response_code":{"type":["string","null"],"description":"The response code of an answer that is no answer, e.g. `SERVFAIL`."},"response_time_ms":{"type":["number","null"],"format":"double"},"server":{"type":"string","description":"The server as mhost names it, e.g. `udp:8.8.8.8:53,name=Google 1`."},"source":{"type":["string","null"],"description":"`recursive` or `authoritative` (authcompare only)."},"transport":{"type":"string","description":"`udp`, `tcp`, `tls` or `https`."}}},"DnsServerCatalogue":{"type":"object","description":"The predefined providers and the group aliases over them.","required":["providers","groups"],"properties":{"groups":{"type":"array","items":{"$ref":"#/components/schemas/DnsServerGroup"}},"providers":{"type":"array","items":{"$ref":"#/components/schemas/ServerInfo"}}}},"DnsServerGroup":{"type":"object","description":"A group alias and the providers it expands to.","required":["name","providers"],"properties":{"name":{"type":"string"},"providers":{"type":"array","items":{"type":"string"}}}},"DnsServerSummary":{"type":"object","description":"One server's lookups over the whole job.","required":["server","transport","lookups","measured","unmeasured"],"properties":{"lookups":{"type":"integer","format":"int32","minimum":0},"measured":{"type":"integer","format":"int32","minimum":0},"median_response_time_ms":{"type":["number","null"],"format":"double","description":"Over the measured lookups; absent when there is none."},"name":{"type":["string","null"]},"server":{"type":"string"},"source":{"type":["string","null"]},"transport":{"type":"string"},"unmeasured":{"type":"integer","format":"int32","minimum":0}}},"DnsTraceDone":{"type":"object","description":"Summary of a trace job.","required":["request_id","duration_ms","hops"],"properties":{"cache_key":{"type":["string","null"]},"duration_ms":{"type":"integer","format":"int64","minimum":0},"hops":{"type":"integer","minimum":0},"request_id":{"type":"string"}}},"DnsTraceEvent":{"oneOf":[{"$ref":"#/components/schemas/DnsHopEvent"},{"$ref":"#/components/schemas/DnsErrorEvent"},{"$ref":"#/components/schemas/DnsEnrichmentEvent"},{"$ref":"#/components/schemas/DnsTraceDone"}],"description":"An event of a trace job."},"DnsTraceResult":{"type":"object","description":"The events of a trace job, collected.","required":["hops","errors","enrichment","done"],"properties":{"done":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DnsTraceDone","description":"`null` when the stream ended before the job finished."}]},"enrichment":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DnsEnrichmentEvent"}]},"errors":{"type":"array","items":{"$ref":"#/components/schemas/DnsErrorEvent"}},"hops":{"type":"array","items":{"$ref":"#/components/schemas/DnsHopEvent"}}}},"DnsTypeComparison":{"type":"object","description":"The answers of every server to one record type.","required":["record_type","agreement","answers"],"properties":{"agreement":{"$ref":"#/components/schemas/Agreement"},"answers":{"type":"array","items":{"$ref":"#/components/schemas/DnsServerAnswer"},"description":"Sorted by source, transport, server."},"record_type":{"type":"string"}}},"DnssecRequest":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"Domain name to validate (e.g. `\"example.com\"`)."},"timeout_secs":{"type":["integer","null"],"format":"int64","description":"Query timeout per level in seconds. Clamped to config max.","minimum":0}}},"EmailCategory":{"type":"string","enum":["mx","spf","dkim","dmarc","mta_sts","tls_rpt","dane","dnssec","bimi","fcrdns","dnsbl","cross_validation"]},"EmailGrade":{"type":"string","enum":["F","D","C","B","A","skipped"]},"EmailInspectRequest":{"type":"object","required":["domain"],"properties":{"dkim_selectors":{"type":"array","items":{"type":"string"},"description":"Custom DKIM selectors the DKIM check probes beside its built-in map: at most\n`dkim.max_user_selectors` (default 5), each 1-63 of `[A-Za-z0-9-]`.","example":["google"]},"domain":{"type":"string","example":"example.com"}},"additionalProperties":false},"EmailInspectResult":{"type":"object","required":["categories","evidence","summary"],"properties":{"categories":{"type":"array","items":{"$ref":"#/components/schemas/CheckResult"}},"evidence":{"type":"array","items":{"$ref":"#/components/schemas/Block"}},"summary":{"$ref":"#/components/schemas/EmailSummary"}}},"EmailMeta":{"type":"object","required":["per_ip_per_minute","per_ip_burst","max_concurrent_inspections"],"properties":{"max_concurrent_inspections":{"type":"integer","format":"int32","minimum":0},"per_ip_burst":{"type":"integer","format":"int32","minimum":0},"per_ip_per_minute":{"type":"integer","format":"int32","minimum":0}}},"EmailSummary":{"type":"object","required":["grade","verdicts","duration_ms"],"properties":{"duration_ms":{"type":"integer","format":"int64","minimum":0},"grade":{"$ref":"#/components/schemas/EmailGrade"},"verdicts":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/Verdict"},"propertyNames":{"type":"string"}}}},"EnrichmentInfo":{"type":"object","required":["ip"],"properties":{"detail_url":{"type":["string","null"],"description":"Public IP-tool page for `ip`; absent when no `[meta] ip_base_url` is configured."},"ip":{"type":"string"},"ip_type":{"type":["string","null"],"description":"IP classification: \"cloud\", \"datacenter\", \"residential\", \"vpn\", \"cdn\", \"isp\", etc."},"org":{"type":["string","null"]},"role":{"type":["string","null"],"description":"ASN network role (e.g. \"Midsize Transit\", \"Access Provider\")."},"threat":{"type":["string","null"],"description":"Threat flag: \"C2\", \"DROP\", or \"TOR\" if the IP is flagged."}}},"EntryView":{"type":"object","required":["id","domain","created_at","last_seen_at","profile_version","grade","engine_version","run"],"properties":{"created_at":{"type":"integer","format":"int64"},"domain":{"type":"string"},"engine_version":{"type":"string"},"grade":{"$ref":"#/components/schemas/Grade"},"id":{"type":"string"},"last_seen_at":{"type":"integer","format":"int64"},"predecessor_id":{"type":["string","null"]},"profile_version":{"type":"integer","format":"int32","minimum":0},"run":{"$ref":"#/components/schemas/Run"}}},"ErrorInfo":{"type":"object","description":"Error detail contained in an error response.","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code (e.g. `INVALID_DOMAIN`)."},"message":{"type":"string","description":"Human-readable error message."}}},"ErrorResponse":{"type":"object","description":"JSON body returned for all error responses.\n\nWire format: `{\"error\": {\"code\": \"...\", \"message\": \"...\"}}`","required":["error"],"properties":{"error":{"$ref":"#/components/schemas/ErrorInfo"}}},"FieldPair":{"type":"array","items":false,"prefixItems":[{"type":"string"},{"oneOf":[{"type":"object","required":["v","t"],"properties":{"t":{"type":"string","enum":["text"]},"v":{"type":"string"}}},{"type":"object","required":["v","t"],"properties":{"t":{"type":"string","enum":["int"]},"v":{"type":"integer","format":"int64"}}},{"type":"object","required":["v","t"],"properties":{"t":{"type":"string","enum":["bool"]},"v":{"type":"boolean"}}},{"type":"object","required":["v","t"],"properties":{"t":{"type":"string","enum":["time"]},"v":{"type":"string"}}},{"type":"object","required":["v","t"],"properties":{"t":{"type":"string","enum":["duration"]},"v":{"type":"integer","format":"int64","minimum":0}}},{"type":"object","required":["v","t"],"properties":{"t":{"type":"string","enum":["addr"]},"v":{"type":"string"}}}],"description":"The schema of a [`Value`]: the tagged union as it serialises. An address is its text form."}],"maxItems":2,"minItems":2},"FingerprintReport":{"type":"object","required":["info_leakage"],"properties":{"info_leakage":{"$ref":"#/components/schemas/InfoLeakage"},"server":{"type":["string","null"]}}},"FixOwner":{"type":"string","description":"Who can fix a failed check.","enum":["dns_provider","registrar","certificate_provider","web_server","mail_provider","hosting"]},"Format":{"type":"string","description":"The forms of `?format=`.","enum":["json","yaml","toml","csv","plain"]},"Grade":{"type":"string","description":"The overall grade of a scan.","enum":["A+","A","B","C","D","F","incomplete"]},"GradeChange":{"type":"object","description":"The grade of both runs. `rescored` is the predecessor re-scored under the current profile,\nset only when the profile versions differ.","required":["from","to"],"properties":{"from":{"$ref":"#/components/schemas/Grade"},"rescored":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Grade"}]},"to":{"$ref":"#/components/schemas/Grade"}}},"HeaderCheck":{"type":"object","required":["status"],"properties":{"message":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/HttpCheckStatus"},"value":{"type":["string","null"]}}},"HealthCheck":{"type":"object","required":["id","category","status","label","detail"],"properties":{"category":{"$ref":"#/components/schemas/Category"},"detail":{"type":"string"},"id":{"type":"string"},"label":{"type":"string"},"status":{"$ref":"#/components/schemas/TlsCheckStatus"}}},"HistoryItem":{"type":"object","required":["id","created_at","last_seen_at","grade","profile_version"],"properties":{"created_at":{"type":"integer","format":"int64"},"grade":{"$ref":"#/components/schemas/Grade"},"id":{"type":"string"},"last_seen_at":{"type":"integer","format":"int64"},"profile_version":{"type":"integer","format":"int32","minimum":0}}},"HistoryResponse":{"type":"object","required":["entries"],"properties":{"entries":{"type":"array","items":{"$ref":"#/components/schemas/HistoryItem"}}}},"HstsCheck":{"type":"object","required":["status","include_sub_domains","preload"],"properties":{"include_sub_domains":{"type":"boolean"},"max_age":{"type":["integer","null"],"format":"int64","minimum":0},"preload":{"type":"boolean"},"status":{"$ref":"#/components/schemas/HttpCheckStatus"}}},"HstsInfo":{"type":"object","required":["present","max_age","include_sub_domains","preload"],"properties":{"include_sub_domains":{"type":"boolean"},"max_age":{"type":"integer","format":"int64","minimum":0},"preload":{"type":"boolean"},"present":{"type":"boolean"}}},"HttpCheckStatus":{"type":"string","enum":["pass","skip","warn","fail"]},"HttpInspectRequest":{"type":"object","required":["url"],"properties":{"url":{"type":"string"}},"additionalProperties":false},"HttpInspectResponse":{"type":"object","required":["url","final_url","timestamp","duration_ms","http_version","status","redirects","headers","security","cors","cookies","caching","cdn","fingerprint","deprecated_headers","reporting","quality","enrichment"],"properties":{"alt_svc":{"type":["string","null"]},"caching":{"$ref":"#/components/schemas/CachingReport"},"cdn":{"$ref":"#/components/schemas/CdnReport"},"compression":{"type":["string","null"]},"cookies":{"type":"array","items":{"$ref":"#/components/schemas/CookieEntry"}},"cors":{"$ref":"#/components/schemas/CorsReport"},"deprecated_headers":{"type":"array","items":{"type":"string"}},"duration_ms":{"type":"integer","format":"int64","minimum":0},"enrichment":{"$ref":"#/components/schemas/EnrichmentInfo"},"error":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProbeError"}]},"final_url":{"type":"string"},"fingerprint":{"$ref":"#/components/schemas/FingerprintReport"},"headers":{"type":"object","additionalProperties":{"type":"string"}},"http_upgrade":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/HttpUpgrade"}]},"http_version":{"type":"string"},"quality":{"$ref":"#/components/schemas/QualityReport"},"redirects":{"type":"array","items":{"$ref":"#/components/schemas/RedirectHop"}},"reporting":{"$ref":"#/components/schemas/ReportingReport"},"security":{"$ref":"#/components/schemas/SecurityReport"},"status":{"type":"integer","format":"int32","minimum":0},"timestamp":{"type":"string"},"url":{"type":"string"}}},"HttpUpgrade":{"type":"object","required":["redirects_to_https","same_host","message","redirects"],"properties":{"error":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ProbeError"}]},"message":{"type":"string"},"redirects":{"type":"array","items":{"$ref":"#/components/schemas/RedirectHop"}},"redirects_to_https":{"type":"boolean"},"same_host":{"type":"boolean"},"status_code":{"type":["integer","null"],"format":"int32","minimum":0}}},"Ifconfig":{"type":"object","required":["ip","location","network"],"properties":{"ip":{"$ref":"#/components/schemas/Ip"},"location":{"$ref":"#/components/schemas/Location"},"network":{"$ref":"#/components/schemas/Network"},"tcp":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Tcp"}]},"user_agent":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/UserAgent"}]}}},"InfoLeakage":{"type":"object","required":["status","exposed_headers"],"properties":{"exposed_headers":{"type":"array","items":{"type":"string"}},"status":{"$ref":"#/components/schemas/HttpCheckStatus"}}},"InspectionError":{"type":"object","description":"Per-IP error detail embedded in inspection results.","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code: `HANDSHAKE_FAILED`, `HANDSHAKE_TIMEOUT` or\n`NOT_TESTED_FROM_HERE`."},"message":{"type":"string","description":"Human-readable error message."}}},"InspectorMeta":{"type":"object","required":["per_ip_per_minute","per_ip_burst","per_target_per_minute","per_target_burst"],"properties":{"per_ip_burst":{"type":"integer","format":"int32","minimum":0},"per_ip_per_minute":{"type":"integer","format":"int32","minimum":0},"per_target_burst":{"type":"integer","format":"int32","minimum":0},"per_target_per_minute":{"type":"integer","format":"int32","minimum":0}}},"Ip":{"type":"object","required":["addr","version"],"properties":{"addr":{"type":"string","example":"203.0.113.42"},"hostname":{"type":["string","null"],"example":"dns.example.com"},"version":{"type":"string","example":"4"}}},"IpDiff":{"type":"object","required":["a","b","equal"],"properties":{"a":{"$ref":"#/components/schemas/Ip"},"b":{"$ref":"#/components/schemas/Ip"},"equal":{"type":"boolean"}}},"IpEnrichment":{"type":"object","description":"Enrichment data for an IP address, included in MX results for frontend display.","required":["ip"],"properties":{"asn":{"type":["integer","null"],"format":"int32","minimum":0},"ip":{"type":"string"},"ip_type":{"type":["string","null"]},"org":{"type":["string","null"]}}},"IpInfo":{"type":"object","description":"Metadata about a single IP address from the enrichment API.","properties":{"asn":{"type":["integer","null"],"format":"int32","minimum":0},"cloud":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/TlsCloudInfo"}]},"is_c2":{"type":"boolean"},"is_datacenter":{"type":"boolean"},"is_spamhaus":{"type":"boolean"},"is_tor":{"type":"boolean"},"is_vpn":{"type":"boolean"},"network_role":{"type":["string","null"],"description":"ASN network role from ipverse/as-metadata (e.g. \"Midsize Transit\", \"Access Provider\")."},"org":{"type":["string","null"]},"type":{"type":["string","null"],"description":"IP classification: \"cloud\", \"datacenter\", \"residential\", \"vpn\", etc."}}},"IpInspectionResult":{"type":"object","description":"Result of inspecting a single IP on a single port.","required":["ip","ip_version"],"properties":{"chain":{"type":["array","null"],"items":{"$ref":"#/components/schemas/CertInfo"}},"ct":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CtInfo"}]},"enrichment":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/IpInfo"}]},"error":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/InspectionError"}]},"ip":{"type":"string"},"ip_version":{"type":"string"},"tls":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/TlsParams"}]},"validation":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ValidationResult"}]}}},"IpMeta":{"type":"object","required":["per_ip_per_minute","per_ip_burst","per_target_per_minute","per_target_burst","batch_max_size","batch_addresses_per_minute","batch_addresses_burst"],"properties":{"batch_addresses_burst":{"type":"integer","format":"int32","minimum":0},"batch_addresses_per_minute":{"type":"integer","format":"int32","minimum":0},"batch_max_size":{"type":"integer","format":"int32","minimum":0},"per_ip_burst":{"type":"integer","format":"int32","minimum":0},"per_ip_per_minute":{"type":"integer","format":"int32","minimum":0},"per_target_burst":{"type":"integer","format":"int32","minimum":0},"per_target_per_minute":{"type":"integer","format":"int32","minimum":0}}},"Limits":{"type":"object","required":["api","admission","rate_limit","ip","tls","http","email","dns"],"properties":{"admission":{"$ref":"#/components/schemas/AdmissionMeta"},"api":{"$ref":"#/components/schemas/ApiLimits"},"dns":{"$ref":"#/components/schemas/DnsMeta"},"email":{"$ref":"#/components/schemas/EmailMeta"},"http":{"$ref":"#/components/schemas/InspectorMeta"},"ip":{"$ref":"#/components/schemas/IpMeta"},"rate_limit":{"$ref":"#/components/schemas/RateLimitMeta"},"tls":{"$ref":"#/components/schemas/InspectorMeta"}}},"Location":{"type":"object","properties":{"accuracy_radius_km":{"type":["integer","null"],"format":"int32","example":100,"minimum":0},"city":{"type":["string","null"],"example":"Berlin"},"city_localized":{"type":["string","null"],"description":"Localized city name when `?lang=` is specified and a locale other than `en` was found.","example":null},"continent":{"type":["string","null"],"example":"Europe"},"continent_code":{"type":["string","null"],"example":"EU"},"country":{"type":["string","null"],"example":"Germany"},"country_iso":{"type":["string","null"],"example":"DE"},"country_localized":{"type":["string","null"],"description":"Localized country name when `?lang=` is specified and a locale other than `en` was found.","example":null},"is_eu":{"type":["boolean","null"],"example":true},"latitude":{"type":["number","null"],"format":"double","example":52.52},"longitude":{"type":["number","null"],"format":"double","example":13.405},"postal_code":{"type":["string","null"],"example":"10115"},"region":{"type":["string","null"],"example":"Berlin"},"region_code":{"type":["string","null"],"example":"BE"},"registered_country":{"type":["string","null"],"description":"Country where the IP block is registered (differs from `country` for VPN exit nodes).","example":"United States"},"registered_country_iso":{"type":["string","null"],"example":"US"},"timezone":{"type":["string","null"],"example":"Europe/Berlin"}}},"LocationDiff":{"type":"object","required":["a","b","equal"],"properties":{"a":{"$ref":"#/components/schemas/Location"},"b":{"$ref":"#/components/schemas/Location"},"equal":{"type":"boolean"}}},"Meta":{"type":"object","required":["version","api","current_profile","profiles","evidence_schema_version","attribution","limits"],"properties":{"api":{"type":"string"},"attribution":{"type":"string","description":"The MaxMind GeoLite2 attribution text the IP data requires next to its use."},"current_profile":{"type":"integer","format":"int32","minimum":0},"evidence_schema_version":{"type":"integer","format":"int32","minimum":0},"limits":{"$ref":"#/components/schemas/Limits"},"profiles":{"type":"array","items":{"type":"integer","format":"int32","minimum":0}},"version":{"type":"string"}}},"Network":{"type":"object","required":["type","infra_type","is_internal","is_datacenter","is_vpn","is_tor","is_bot","is_c2","is_spamhaus","is_anycast","is_cins"],"properties":{"asn":{"type":["integer","null"],"format":"int32","example":64496,"minimum":0},"asn_category":{"type":["string","null"],"description":"ASN category from ipverse/as-metadata (hosting/isp/business/education_research/government_admin).","example":null},"asn_registered":{"type":["string","null"],"description":"ASN registration date from ipverse/as-metadata (YYYY-MM-DD). Null for internal IPs or unknown ASNs.","example":null},"bot":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/NetworkBot","description":"Bot identity when the IP is a known crawler range."}]},"cloud":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/CloudInfo","description":"Cloud provider identity when the IP is a cloud CIDR match."}]},"iana_label":{"type":["string","null"],"description":"IANA special-purpose address registry label, if applicable.","example":null},"infra_type":{"type":"string","description":"Infrastructure dimension, orthogonal to type. One of: internal, cloud, datacenter, government, education, business, residential.","example":"residential"},"is_anycast":{"type":"boolean","description":"True when the IP belongs to a known anycast network (Cloudflare, Akamai, Fastly, Google DNS).","example":false},"is_bot":{"type":"boolean","example":false},"is_c2":{"type":"boolean","description":"True when the IP is an active Feodo botnet C2 node.","example":false},"is_cins":{"type":"boolean","description":"True when the IP appears in the CINS Army bad-actor list.","example":false},"is_datacenter":{"type":"boolean","example":false},"is_internal":{"type":"boolean","description":"True when the IP belongs to a private or reserved range (RFC 1918, loopback, link-local, IPv6 ULA).","example":false},"is_spamhaus":{"type":"boolean","description":"True when the IP falls in a Spamhaus DROP/EDROP hijacked netblock.","example":false},"is_tor":{"type":"boolean","example":false},"is_vpn":{"type":"boolean","example":false},"network_role":{"type":["string","null"],"description":"Network role from ipverse/as-metadata (e.g. \"stub\", \"tier1_transit\").","example":null},"org":{"type":["string","null"],"example":"Example Telecom AG"},"prefix":{"type":["string","null"],"example":null},"type":{"type":"string","description":"Primary signal: highest-priority classification. One of: internal, c2, bot, cloud, vpn, tor, spamhaus, datacenter, residential.","example":"residential"},"vpn":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/VpnInfo","description":"VPN identity when the IP is a VPN match."}]}}},"NetworkBot":{"type":"object","required":["provider"],"properties":{"provider":{"type":"string","example":"googlebot"}}},"NetworkDiff":{"type":"object","required":["a","b","equal"],"properties":{"a":{"$ref":"#/components/schemas/Network"},"b":{"$ref":"#/components/schemas/Network"},"equal":{"type":"boolean"}}},"Node":{"type":"object","description":"A node of a `tree` block.","required":["fields","children"],"properties":{"children":{"type":"array","items":{"$ref":"#/components/schemas/Node"}},"fields":{"type":"array","items":{"$ref":"#/components/schemas/FieldPair"}}}},"OS":{"type":"object","required":["family","version"],"properties":{"family":{"type":"string","example":"Mac OS X"},"major":{"type":["string","null"],"example":"14"},"minor":{"type":["string","null"],"example":"0"},"patch":{"type":["string","null"]},"patch_minor":{"type":["string","null"]},"version":{"type":"string","example":"14.0"}}},"OcspInfo":{"type":"object","required":["stapled"],"properties":{"next_update":{"type":["string","null"]},"stapled":{"type":"boolean"},"status":{"type":["string","null"]},"this_update":{"type":["string","null"]}}},"OcspRevocationResult":{"type":"object","description":"Result of a live OCSP revocation check via the AIA OCSP responder URL.","required":["status","checked_at"],"properties":{"checked_at":{"type":"string","description":"ISO 8601 timestamp when this check was performed"},"reason":{"type":["string","null"],"description":"Revocation reason string when status == \"revoked\"; \"blocked\" when the responder URL\nwas refused"},"revoked_at":{"type":["string","null"],"description":"ISO 8601 revocation time (only set when status == \"revoked\")"},"status":{"type":"string","description":"\"good\", \"revoked\", or \"unknown\""}}},"PortQualityResult":{"type":"object","required":["verdict","checks"],"properties":{"checks":{"type":"array","items":{"$ref":"#/components/schemas/HealthCheck"}},"verdict":{"$ref":"#/components/schemas/TlsCheckStatus"}}},"PortResult":{"type":"object","required":["port","ips"],"properties":{"consistency":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ConsistencyResult"}]},"error":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/InspectionError"}]},"ips":{"type":"array","items":{"$ref":"#/components/schemas/IpInspectionResult"}},"port":{"type":"integer","format":"int32","minimum":0},"quality":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/PortQualityResult"}]},"tlsa":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/TlsaInfo"}]},"validation":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/ValidationResult"}]}}},"PostQueryRequest":{"type":"object","required":["domain"],"properties":{"dnssec":{"type":"boolean","description":"Enable DNSSEC mode (adds DNSKEY and DS record types)."},"domain":{"type":"string","description":"Domain name to query (e.g. `\"example.com\"`)."},"record_types":{"type":"array","items":{"type":"string"},"description":"DNS record types to query (e.g. `[\"A\", \"MX\"]`). Defaults to A, AAAA, CNAME, MX."},"servers":{"type":"array","items":{"type":"string"},"description":"DNS servers to use (e.g. `[\"cloudflare\", \"8.8.8.8\"]`). Defaults to config default_servers."},"transport":{"type":["string","null"],"description":"Transport: `udp` (default), `tcp`, `tls`, or `https`."}}},"ProbeError":{"type":"object","description":"Why a probe got no response.","required":["kind","message"],"properties":{"kind":{"$ref":"#/components/schemas/ProbeErrorKind"},"message":{"type":"string"}}},"ProbeErrorKind":{"type":"string","enum":["timeout","refused","reset","tls","blocked","unreachable"]},"Profile":{"type":"object","description":"A parsed scoring profile.","required":["name","version","sections","thresholds"],"properties":{"name":{"type":"string"},"sections":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/SectionWeights"},"propertyNames":{"type":"string","description":"The protocol a check belongs to.","enum":["dns","tls","http","email","ip"]}},"thresholds":{"type":"array","items":{"$ref":"#/components/schemas/Threshold"},"description":"Grade thresholds, highest first."},"version":{"type":"integer","format":"int32","minimum":0}}},"Protocol":{"type":"string","description":"The protocol a check belongs to.","enum":["dns","tls","http","email","ip"]},"QualityCheck":{"type":"object","required":["name","label","status"],"properties":{"explanation":{"type":["string","null"]},"label":{"type":"string"},"message":{"type":["string","null"]},"name":{"type":"string"},"status":{"$ref":"#/components/schemas/HttpCheckStatus"}}},"QualityReport":{"type":"object","required":["verdict","checks"],"properties":{"checks":{"type":"array","items":{"$ref":"#/components/schemas/QualityCheck"}},"verdict":{"$ref":"#/components/schemas/HttpCheckStatus"}}},"QualityResult":{"type":"object","required":["verdict","checks"],"properties":{"checks":{"type":"array","items":{"$ref":"#/components/schemas/HealthCheck"}},"hsts":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/HstsInfo"}]},"https_redirect":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/RedirectInfo"}]},"verdict":{"$ref":"#/components/schemas/TlsCheckStatus"}}},"RangeResponse":{"type":"object","required":["cidr","network_type","is_cloud","is_vpn","is_datacenter","is_spamhaus","is_c2"],"properties":{"asn":{"type":["integer","null"],"format":"int32","description":"ASN that originates this prefix (from MaxMind lookup on the network address).","example":15169,"minimum":0},"cidr":{"type":"string","description":"The CIDR prefix as provided.","example":"8.8.8.0/24"},"is_c2":{"type":"boolean","description":"True if the network address is a Feodo C2 node.","example":false},"is_cloud":{"type":"boolean","description":"True if the network address is a cloud CIDR.","example":false},"is_datacenter":{"type":"boolean","description":"True if the network address is a datacenter.","example":false},"is_spamhaus":{"type":"boolean","description":"True if the network address matches Spamhaus DROP.","example":false},"is_vpn":{"type":"boolean","description":"True if the network address matches VPN ranges.","example":false},"network_type":{"type":"string","description":"Network type classification of the network address.","example":"cloud"},"org":{"type":["string","null"],"description":"Organization name for the ASN.","example":"Google LLC"}}},"RateLimitMeta":{"type":"object","required":["per_ip_per_minute","per_ip_burst","global_per_minute","global_burst"],"properties":{"global_burst":{"type":"integer","format":"int32","minimum":0},"global_per_minute":{"type":"integer","format":"int32","minimum":0},"per_ip_burst":{"type":"integer","format":"int32","minimum":0},"per_ip_per_minute":{"type":"integer","format":"int32","minimum":0}}},"Record":{"type":"object","description":"A DNS resource record.","required":["owner","type","ttl","data"],"properties":{"data":{"$ref":"#/components/schemas/Value"},"owner":{"$ref":"#/components/schemas/Value"},"ttl":{"$ref":"#/components/schemas/Value"},"type":{"$ref":"#/components/schemas/Value"}}},"RecordTypeInfo":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"DNS record type name (e.g. `\"A\"`, `\"MX\"`, `\"TXT\"`)."}}},"RecordedKind":{"type":"string","description":"What the history did with a finished run.","enum":["first","identical","changed","not_stored"]},"RedirectHop":{"type":"object","required":["url","status","http_version"],"properties":{"http_version":{"type":"string"},"location":{"type":["string","null"]},"status":{"type":"integer","format":"int32","minimum":0},"url":{"type":"string"}}},"RedirectInfo":{"type":"object","required":["status"],"properties":{"redirect_url":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/TlsCheckStatus"}}},"ReferralGroup":{"type":"object","description":"A group of servers that returned the same NS referral set.","required":["ns_names","servers","is_majority"],"properties":{"is_majority":{"type":"boolean"},"ns_names":{"type":"array","items":{"type":"string"}},"servers":{"type":"array","items":{"type":"string"}}}},"ReportingReport":{"type":"object","required":["report_to","nel","csp_reporting"],"properties":{"csp_reporting":{"type":"boolean"},"nel":{"type":"boolean"},"report_to":{"type":"boolean"}}},"Run":{"type":"object","description":"One scan as stored for history.","required":["profile_version","engine_version","evidence_schema_version","grade","complete","sections","checks","blocks"],"properties":{"blocks":{"type":"array","items":{"$ref":"#/components/schemas/Block"}},"checks":{"type":"array","items":{"$ref":"#/components/schemas/RunCheck"}},"complete":{"type":"boolean"},"engine_version":{"type":"string"},"evidence_schema_version":{"type":"integer","format":"int32","minimum":0},"grade":{"$ref":"#/components/schemas/Grade"},"profile_version":{"type":"integer","format":"int32","minimum":0},"sections":{"type":"array","items":{"$ref":"#/components/schemas/RunSection"}}}},"RunAnswer":{"type":"object","description":"The answer of a fresh run: the run, how the history recorded it, and the diff when it has one.","required":["recorded","run"],"properties":{"diff":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Diff"}]},"entry_id":{"type":["string","null"]},"recorded":{"$ref":"#/components/schemas/RecordedKind"},"run":{"$ref":"#/components/schemas/Run"}}},"RunCheck":{"type":"object","description":"A check's id, status, findings and evidence references. Findings and evidence are outside\nthe fingerprint and the diff.","required":["id","status"],"properties":{"evidence":{"type":"array","items":{"$ref":"#/components/schemas/BlockId"}},"findings":{"type":"array","items":{"type":"string"}},"id":{"$ref":"#/components/schemas/CheckId"},"status":{"$ref":"#/components/schemas/Status"}}},"RunSection":{"type":"object","description":"How one protocol's section ended.","required":["protocol","outcome"],"properties":{"outcome":{"$ref":"#/components/schemas/SectionKind"},"protocol":{"$ref":"#/components/schemas/Protocol"},"reason":{"type":["string","null"]}}},"RunSectionEvent":{"type":"object","description":"One finished section of a running check, as the `section` event of the stream.","required":["protocol","outcome","checks","blocks"],"properties":{"blocks":{"type":"array","items":{"$ref":"#/components/schemas/Block"}},"checks":{"type":"array","items":{"$ref":"#/components/schemas/RunCheck"}},"outcome":{"$ref":"#/components/schemas/SectionKind"},"protocol":{"$ref":"#/components/schemas/Protocol"},"reason":{"type":["string","null"]}}},"SctEntry":{"type":"object","required":["version","log_id","timestamp"],"properties":{"log_id":{"type":"string"},"timestamp":{"type":"string"},"version":{"type":"integer","format":"int32","minimum":0}}},"SectionKind":{"type":"string","enum":["measured","not_applicable","incomplete","timed_out"]},"SectionWeights":{"type":"object","description":"One section's weight, its weighted checks and the checks whose failure forces `F`.","required":["weight","checks","hard_fail"],"properties":{"checks":{"type":"object","additionalProperties":{"type":"integer","format":"int32","minimum":0},"propertyNames":{"type":"string","examples":["tls.chain_trusted"]}},"hard_fail":{"type":"array","items":{"$ref":"#/components/schemas/CheckId"}},"weight":{"type":"integer","format":"int32","minimum":0}}},"SecurityReport":{"type":"object","required":["hsts","csp","x_frame_options","permissions_policy","x_content_type_options","referrer_policy","coop","coep","corp"],"properties":{"coep":{"$ref":"#/components/schemas/HeaderCheck"},"coop":{"$ref":"#/components/schemas/HeaderCheck"},"corp":{"$ref":"#/components/schemas/HeaderCheck"},"csp":{"$ref":"#/components/schemas/CspReport"},"hsts":{"$ref":"#/components/schemas/HstsCheck"},"permissions_policy":{"$ref":"#/components/schemas/HeaderCheck"},"referrer_policy":{"$ref":"#/components/schemas/HeaderCheck"},"x_content_type_options":{"$ref":"#/components/schemas/HeaderCheck"},"x_frame_options":{"$ref":"#/components/schemas/HeaderCheck"}}},"ServerConfigInfo":{"type":"object","required":["description","protocol"],"properties":{"description":{"type":"string","description":"Human-readable string representation (e.g. \"udp:1.1.1.1:53,name=Cloudflare 1\")."},"protocol":{"type":"string","description":"Transport protocol: `udp`, `tcp`, `tls`, or `https`."}}},"ServerInfo":{"type":"object","required":["name","configs"],"properties":{"configs":{"type":"array","items":{"$ref":"#/components/schemas/ServerConfigInfo"}},"name":{"type":"string","description":"Provider name (e.g. `\"cloudflare\"`)."}}},"ServerOutcome":{"oneOf":[{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["referral"]}}},{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["answer"]}}},{"type":"object","required":["message","type"],"properties":{"message":{"type":"string"},"type":{"type":"string","enum":["error"]}}}],"description":"Outcome classification for a single server response."},"ServerResult":{"type":"object","description":"One server's outcome within a hop.","required":["server_ip","latency_ms","outcome"],"properties":{"answer_records":{"type":"array","items":{"$ref":"#/components/schemas/DnsRecord"}},"authority_zone":{"type":["string","null"]},"latency_ms":{"type":"number","format":"double"},"outcome":{"$ref":"#/components/schemas/ServerOutcome"},"referral_ns":{"type":"array","items":{"type":"string"}},"server_ip":{"type":"string"},"server_name":{"type":["string","null"]}}},"Severity":{"type":"string","description":"How serious a failed check is.","enum":["critical","high","medium","low"]},"Shape":{"oneOf":[{"type":"object","required":["data","kind"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Record"}},"kind":{"type":"string","enum":["records"]}}},{"type":"object","required":["data","kind"],"properties":{"data":{"type":"object","required":["key","columns","rows"],"properties":{"columns":{"type":"array","items":{"type":"string"}},"key":{"type":"string"},"rows":{"type":"array","items":{"type":"array","items":{"$ref":"#/components/schemas/Value"}}}}},"kind":{"type":"string","enum":["table"]}}},{"type":"object","required":["data","kind"],"properties":{"data":{"type":"array","items":{"type":"array","items":{"$ref":"#/components/schemas/FieldPair"}}},"kind":{"type":"string","enum":["chain"]}}},{"type":"object","required":["data","kind"],"properties":{"data":{"$ref":"#/components/schemas/Node"},"kind":{"type":"string","enum":["tree"]}}},{"type":"object","required":["data","kind"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/FieldPair"}},"kind":{"type":"string","enum":["fields"]}}},{"type":"object","required":["data","kind"],"properties":{"data":{"type":"string"},"kind":{"type":"string","enum":["text"]}}}],"description":"The schema of a [`Shape`], the adjacently tagged union as it serialises."},"SseEvent":{"oneOf":[{"allOf":[{"$ref":"#/components/schemas/CheckResult"},{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["category"]}}}]},{"type":"object","required":["grade","verdicts","duration_ms","type"],"properties":{"duration_ms":{"type":"integer","format":"int64","minimum":0},"grade":{"$ref":"#/components/schemas/EmailGrade"},"type":{"type":"string","enum":["summary"]},"verdicts":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/Verdict"},"propertyNames":{"type":"string"}}}},{"type":"object","description":"The evidence blocks of the run, sent once right before `Summary`.","required":["blocks","type"],"properties":{"blocks":{"type":"array","items":{"$ref":"#/components/schemas/Block"}},"type":{"type":"string","enum":["evidence"]}}}]},"Status":{"type":"string","description":"The outcome of one check.","enum":["pass","warn","fail","not_applicable","not_tested","unmeasured"]},"SubCheck":{"type":"object","required":["name","verdict","detail"],"properties":{"detail":{"type":"string"},"name":{"type":"string"},"verdict":{"$ref":"#/components/schemas/Verdict"}}},"Summary":{"type":"object","required":["verdict","checks"],"properties":{"checks":{"$ref":"#/components/schemas/SummaryChecks"},"verdict":{"$ref":"#/components/schemas/TlsCheckStatus"}}},"SummaryChecks":{"type":"object","required":["chain_trusted","not_expired","hostname_match","caa_compliant","dane_valid","ct_logged","ocsp_stapled","consistency"],"properties":{"caa_compliant":{"$ref":"#/components/schemas/TlsCheckStatus"},"chain_trusted":{"$ref":"#/components/schemas/TlsCheckStatus"},"consistency":{"$ref":"#/components/schemas/TlsCheckStatus"},"ct_logged":{"$ref":"#/components/schemas/TlsCheckStatus"},"dane_valid":{"$ref":"#/components/schemas/TlsCheckStatus"},"hostname_match":{"$ref":"#/components/schemas/TlsCheckStatus"},"not_expired":{"$ref":"#/components/schemas/TlsCheckStatus"},"ocsp_stapled":{"$ref":"#/components/schemas/TlsCheckStatus"}}},"Tcp":{"type":"object","required":["port"],"properties":{"port":{"type":"integer","format":"int32","example":54321,"minimum":0}}},"TcpDiff":{"type":"object","required":["equal"],"properties":{"a":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Tcp"}]},"b":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/Tcp"}]},"equal":{"type":"boolean"}}},"Threshold":{"type":"object","description":"One grade threshold as served: the lowest score that earns `grade`.","required":["grade","min"],"properties":{"grade":{"$ref":"#/components/schemas/Grade"},"min":{"type":"integer","format":"int32","minimum":0}}},"TlsCheckStatus":{"type":"string","enum":["pass","warn","fail","skip"]},"TlsCloudInfo":{"type":"object","description":"Cloud provider metadata from the enrichment API.","properties":{"provider":{"type":["string","null"]},"region":{"type":["string","null"]},"service":{"type":["string","null"]}}},"TlsInspectRequest":{"type":"object","description":"One host and its port or ports to inspect.","required":["host"],"properties":{"host":{"type":"string"},"port":{"type":"integer","format":"int32","description":"The port; 443 by default.","default":443,"minimum":0},"ports":{"type":"array","items":{"type":"integer","format":"int32","minimum":0},"description":"Several ports instead of `port`, at most `limits.max_ports`, each inspected once."}},"additionalProperties":false},"TlsInspectResponse":{"type":"object","required":["request_id","hostname","input_mode","summary","ports","duration_ms"],"properties":{"dns":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/DnsContext"}]},"duration_ms":{"type":"integer","format":"int64","minimum":0},"hostname":{"type":"string"},"input_mode":{"type":"string"},"ports":{"type":"array","items":{"$ref":"#/components/schemas/PortResult"}},"quality":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/QualityResult"}]},"request_id":{"type":"string"},"skipped_ips":{"type":"array","items":{"type":"string"}},"summary":{"$ref":"#/components/schemas/Summary"},"warnings":{"type":"array","items":{"type":"string"}}}},"TlsParams":{"type":"object","required":["version","cipher_suite","ocsp","handshake_ms"],"properties":{"alpn":{"type":["string","null"]},"cipher_suite":{"type":"string"},"ech_advertised":{"type":["boolean","null"],"description":"Whether ECH (Encrypted Client Hello) is advertised via the HTTPS DNS record."},"handshake_ms":{"type":"integer","format":"int32","minimum":0},"key_exchange_group":{"type":["string","null"]},"ocsp":{"$ref":"#/components/schemas/OcspInfo"},"ocsp_live":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/OcspRevocationResult","description":"Live OCSP revocation check result (queried after handshake if AIA OCSP URL is present)."}]},"sni":{"type":["string","null"]},"starttls":{"type":["string","null"],"description":"STARTTLS protocol used to upgrade the connection (e.g. \"smtp\"), if applicable."},"version":{"type":"string"}}},"TlsaInfo":{"type":"object","required":["records","dnssec_signed"],"properties":{"dane_valid":{"type":["boolean","null"]},"dnssec_signed":{"type":"boolean"},"records":{"type":"array","items":{"type":"string"}}}},"TokenInfo":{"type":"object","required":["kind","value","from","to"],"properties":{"from":{"type":"integer","description":"Start byte offset of the token in the input string.","minimum":0},"kind":{"type":"string","description":"Token classification: `domain`, `record_type`, `server`, `server_partial`, `flag`, `flag_partial`, `unknown`."},"to":{"type":"integer","description":"End byte offset of the token in the input string.","minimum":0},"value":{"type":"string"}}},"TraceHop":{"type":"object","description":"A single delegation hop in the trace.","required":["level","zone","servers_queried","server_results","referral_groups","is_final"],"properties":{"is_final":{"type":"boolean"},"level":{"type":"integer","minimum":0},"referral_groups":{"type":"array","items":{"$ref":"#/components/schemas/ReferralGroup"}},"server_results":{"type":"array","items":{"$ref":"#/components/schemas/ServerResult"}},"servers_queried":{"type":"integer","minimum":0},"zone":{"type":"string"}}},"TraceRequest":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"Domain name to trace (e.g. `\"example.com\"`)."},"record_type":{"type":"string","description":"DNS record type to trace (default: `\"A\"`)."},"timeout_secs":{"type":["integer","null"],"format":"int64","description":"Query timeout per hop in seconds. Clamped to config max.","minimum":0}}},"UserAgent":{"type":"object","required":["device","os","browser"],"properties":{"browser":{"$ref":"#/components/schemas/Browser"},"device":{"$ref":"#/components/schemas/Device"},"os":{"$ref":"#/components/schemas/OS"},"raw":{"type":["string","null"],"example":"curl/8.7.1"}}},"UserAgentDiff":{"type":"object","required":["equal"],"properties":{"a":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/UserAgent"}]},"b":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/UserAgent"}]},"equal":{"type":"boolean"}}},"ValidationResult":{"type":"object","required":["chain_trusted","terminates_at_self_signed","ends_at_anchor","chain_order_correct","leaf_covers_hostname","any_expired","any_not_yet_valid","weakest_signature","earliest_expiry","earliest_expiry_days"],"properties":{"any_expired":{"type":"boolean"},"any_not_yet_valid":{"type":"boolean"},"chain_order_correct":{"type":"boolean"},"chain_trust_reason":{"type":["string","null"]},"chain_trusted":{"type":"boolean"},"earliest_expiry":{"type":"string"},"earliest_expiry_days":{"type":"integer","format":"int64"},"ends_at_anchor":{"type":"boolean"},"leaf_covers_hostname":{"type":"boolean"},"terminates_at_self_signed":{"type":"boolean"},"weakest_signature":{"type":"string"}}},"Value":{"oneOf":[{"type":"object","required":["v","t"],"properties":{"t":{"type":"string","enum":["text"]},"v":{"type":"string"}}},{"type":"object","required":["v","t"],"properties":{"t":{"type":"string","enum":["int"]},"v":{"type":"integer","format":"int64"}}},{"type":"object","required":["v","t"],"properties":{"t":{"type":"string","enum":["bool"]},"v":{"type":"boolean"}}},{"type":"object","required":["v","t"],"properties":{"t":{"type":"string","enum":["time"]},"v":{"type":"string"}}},{"type":"object","required":["v","t"],"properties":{"t":{"type":"string","enum":["duration"]},"v":{"type":"integer","format":"int64","minimum":0}}},{"type":"object","required":["v","t"],"properties":{"t":{"type":"string","enum":["addr"]},"v":{"type":"string"}}}],"description":"The schema of a [`Value`]: the tagged union as it serialises. An address is its text form."},"Verdict":{"type":"string","enum":["skip","info","pass","warn","fail"]},"VpnInfo":{"type":"object","properties":{"provider":{"type":["string","null"],"description":"Provider name when identified via ASN heuristic; None when only CIDR matched.","example":null}}}}}}