{
  "openapi": "3.1.1",
  "info": {
    "title": "Signalhouse API",
    "version": "1.0.0",
    "summary": "Deterministic tools for people and AI agents.",
    "description": "Every endpoint performs the same calculation as the human page and returns inputs, result, units, assumptions, sources, warnings and computedAt. MCP endpoint: /mcp."
  },
  "servers": [
    {
      "url": "https://signalhouse.usefulweb.site"
    }
  ],
  "paths": {
    "/api/v1/tools": {
      "get": {
        "operationId": "listTools",
        "summary": "Catalog of all tools",
        "responses": {
          "200": {
            "description": "Tool list.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/{id}": {
      "get": {
        "operationId": "getTool",
        "summary": "Definition of one tool",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "headerlens",
                "dns-certificate-explorer",
                "email-infrastructure-explorer",
                "security-configuration-scanner",
                "http-technology-explorer",
                "cdn-behavior-explorer",
                "ipv6-readiness-explorer",
                "global-dns-explorer",
                "certificate-transparency-explorer",
                "domain-history-graph",
                "bgp-route-explorer",
                "asn-relationship-explorer",
                "internet-outage-atlas",
                "ai-website-readiness-explorer",
                "a11y-snapshot",
                "website-change-explainer",
                "scam-signal-checker",
                "browser-compatibility-checker",
                "network-speed-tester",
                "explore"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Tool definition.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "404": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/headerlens/calculate": {
      "post": {
        "operationId": "calculateHeaderlens",
        "summary": "Is a website down? Multi-region status, redirects, TLS and security headers.",
        "description": "Checks a public website from every configured probe region at once, separates \"down\" from \"up but blocking bots\", and explains redirects, TLS and security/caching headers in plain English.\n\nMethodology:\n- Each check probes https://host/ (falling back to http) from every configured region in parallel; each region produces its own observation.\n- Per region: DNS → TLS → bounded GET with up to 5 re-validated redirects; 401/403/429/challenge pages are \"reachable_restricted\", not \"down\".\n- Consensus: unanimous / majority / partial_outage (some regions down, others up → degraded) / no_conclusive_data.\n- Only public addresses are ever contacted (SSRF-safe: re-validated at connect time and on every redirect).",
        "tags": [
          "developer"
        ],
        "x-mcp-tool": "headerlens",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HeaderlensInput"
              },
              "examples": {
                "example1": {
                  "summary": "example.com",
                  "value": {
                    "target": "example.com"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HeaderlensResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/dns-certificate-explorer/calculate": {
      "post": {
        "operationId": "calculateDnsCertificateExplorer",
        "summary": "DNS records, e-mail security, CAA, live TLS certificate and CT history for a domain.",
        "description": "Resolves A, AAAA, CNAME, MX, NS, TXT, CAA and SOA records, analyses e-mail spoofing protection (SPF lookups and \"all\" policy, DMARC policy and reporting, MTA-STS), fetches the live TLS certificate from the domain's public IP (issuer, SANs, expiry, key, chain, TLS version, browser trust) and lists recent certificates from Certificate Transparency logs via crt.sh.\n\nMethodology:\n- DNS queries via the server's resolver: A, AAAA, CNAME, MX, NS, TXT, CAA, SOA for the domain and TXT at _dmarc.<domain> and _mta-sts.<domain>.\n- SPF (RFC 7208): one record allowed, max 10 DNS-querying mechanisms, policy from the \"all\" qualifier. DMARC (RFC 7489): p=, pct=, rua=.\n- TLS: one connection to the first public IPv4/IPv6 address on port 443 with SNI; the certificate is verified against Node's trusted root store and the hostname (private addresses are never contacted).\n- Certificate Transparency: crt.sh JSON for the exact domain, latest 25 entries (deduplicated by serial, precertificates included).",
        "tags": [
          "infrastructure"
        ],
        "x-mcp-tool": "dns_certificate_explorer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DnsCertificateExplorerInput"
              },
              "examples": {
                "example1": {
                  "summary": "example.com",
                  "value": {
                    "domain": "example.com",
                    "certificateTransparency": false
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DnsCertificateExplorerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/email-infrastructure-explorer/calculate": {
      "post": {
        "operationId": "calculateEmailInfrastructureExplorer",
        "summary": "MX, SPF lookups, DMARC, DKIM, MTA-STS, TLS-RPT and BIMI for a domain, scored with fixes.",
        "description": "Checks how a domain receives and protects e-mail: MX hosts with priorities and addresses, SPF with a recursive DNS-lookup count across include: chains, DMARC policy and reporting, DKIM keys at ten common selectors, MTA-STS record and policy file, TLS-RPT and BIMI. Produces a transparent 100-point score and concrete DNS fixes. Works live or on pasted zone records.\n\nMethodology:\n- DNS: MX (+ A/AAAA of each exchange), TXT at the domain, _dmarc, <selector>._domainkey for default, google, selector1, selector2, k1, s1, s2, mail, dkim, mx, _mta-sts, _smtp._tls and default._bimi.\n- SPF (RFC 7208): include: and redirect= are followed recursively; include, a, mx, ptr, exists and redirect each cost one DNS lookup, more than 10 in total is a permerror; more than 2 void lookups is also an error.\n- DMARC (RFC 7489) policy, pct and rua. DKIM (RFC 6376): key type and RSA modulus length decoded from p=; empty p= means revoked. Real selectors are chosen by the sender and cannot be enumerated, so \"none found\" is not proof that DKIM is absent.\n- MTA-STS (RFC 8461): TXT v=STSv1 plus the policy at https://mta-sts.<domain>/.well-known/mta-sts.txt; each MX must match a policy mx: pattern. TLS-RPT (RFC 8460) v=TLSRPTv1 with rua. BIMI needs DMARC quarantine/reject at 100 %.\n- Score (100): MX 10, SPF 20, DMARC 25, DKIM 15, MTA-STS 15, TLS-RPT 10, BIMI 5. Domains with a null MX (no inbound mail) are scored only on SPF and DMARC, scaled to 100.",
        "tags": [
          "infrastructure"
        ],
        "x-mcp-tool": "email_infrastructure_explorer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EmailInfrastructureExplorerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Pasted records for a typical business domain",
                  "value": {
                    "mode": "paste",
                    "domain": "example.org",
                    "records": "; pasted DNS for example.org\n@                      MX   10 mx1.example.net.\n@                      MX   20 mx2.example.net.\nmx1.example.net.    A    192.0.2.10\nmx2.example.net.    A    192.0.2.20\n@                      TXT  \"v=spf1 include:_spf.example.net include:sendgrid.net ip4:198.51.100.0/24 ~all\"\n_spf.example.net.   TXT  \"v=spf1 ip4:192.0.2.0/24 include:_spf2.example.net -all\"\n_spf2.example.net.  TXT  \"v=spf1 a mx -all\"\n_dmarc                 TXT  \"v=DMARC1; p=quarantine; pct=100; rua=mailto:dmarc@example.org\"\nselector1._domainkey   TXT  \"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvO65ahmEjafCxJBT+BnCuE+pM97kMp7njI4Na2g3vJ3AIqbUS2lTQVRlUng5T7BKOAHVmKUnj2fWM+iRt5mQAZ649dKjdQwOPULKmoVMjGMH8SB3P6CYaxJrVgS+PGVtEFgcj8UADfED2ylfiZgAPw7Fx3PQxyfWbenvdEsLyjSyl/2fr/stYzeGvaRDjKd91UoPqZEBC3fyw5Eloyq5L/U2yCSJypPpFe04kC6i4OcIlx6bJUkJWMaodPyFd3x1wuS9jklXaF+yyZhBMIdQzNCyf20QM4lf/SjmyzMsyYs5ILkH4548cgWHuM+wGdGHf5GwI6dTFv0a90bL3hlLdQIDAQAB\"\n_mta-sts               TXT  \"v=STSv1; id=20261001T000000\"\n_smtp._tls             TXT  \"v=TLSRPTv1; rua=mailto:tlsrpt@example.org\"",
                    "mtaStsPolicy": "version: STSv1\nmode: testing\nmx: mx1.example.net\nmx: *.example.net\nmax_age: 604800"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailInfrastructureExplorerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/security-configuration-scanner/calculate": {
      "post": {
        "operationId": "calculateSecurityConfigurationScanner",
        "summary": "Passive, graded check of a domain's TLS, security headers, DNS security and security.txt.",
        "description": "For a domain you are authorised to test, checks the live TLS certificate, HTTP security headers, HTTP→HTTPS redirect, DNSSEC (validated via Google Public DNS), CAA, SPF and DMARC, and /.well-known/security.txt (RFC 9116 Contact and Expires), then grades the result and lists concrete fixes. Passive single requests only. You can also paste headers, DNS records and a certificate summary for an offline review, including cookie flags.\n\nMethodology:\n- Only scan systems you own or are authorised to test. This scanner is passive: a handful of ordinary single requests (the home page over HTTPS and HTTP, /.well-known/security.txt, public DNS and one TLS handshake) and no probing, fuzzing or port scanning.\n- TLS + DNS: the DNS + Certificate Explorer is called once (resolver lookups of TXT/CAA/_dmarc and one TLS handshake on port 443, no CT search). Certificate findings: trust, hostname match, expiry (<14 days = warning), RSA key size, TLS 1.0/1.1.\n- DNSSEC: one query to the Google Public DNS JSON API (dns.google/resolve, do=1); AD=true means the answer was DNSSEC-validated.\n- Headers: one GET of https://<domain>/ analysed with HeaderLens rules (HSTS, CSP, X-Content-Type-Options, framing, Referrer-Policy, Permissions-Policy, version disclosure). Redirect: one GET of http://<domain>/; pass if it ends on https://.\n- security.txt (RFC 9116): Contact and Expires are required; Expires must be in the future, ideally less than a year ahead; served as text/plain.\n- Cookies: only checked from pasted headers (the live fetcher strips Set-Cookie). Only cookie names and flags are reported, never values.\n- Score: 100 minus 20 per high, 8 per medium, 3 per low finding; A ≥ 90, B ≥ 75, C ≥ 60, D ≥ 40, else F; any high finding caps the grade at C.\n\nOnly scan systems you own or are authorised to test. This scanner is passive: a handful of ordinary single requests (the home page over HTTPS and HTTP, /.well-known/security.txt, public DNS and one TLS handshake) and no probing, fuzzing or port scanning.",
        "tags": [
          "security"
        ],
        "x-mcp-tool": "security_configuration_scanner",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SecurityConfigurationScannerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Offline review of pasted findings",
                  "value": {
                    "domain": "shop.example.net",
                    "mode": "pasted",
                    "headers": "HTTP/2 200\ncontent-type: text/html\nstrict-transport-security: max-age=300\nx-content-type-options: nosniff\nserver: nginx/1.18.0\nset-cookie: session=abc; Path=/; HttpOnly\nset-cookie: __Host-csrf=x; Path=/; Secure; HttpOnly; SameSite=Strict",
                    "dnsRecords": "CAA 0 issue \"letsencrypt.org\"\nTXT v=spf1 include:_spf.example.net ~all\nDMARC v=DMARC1; p=none\nDNSSEC no",
                    "certificate": "issuer: CN=R11, O=Let's Encrypt, C=US\nvalidTo: 2026-10-20T12:00:00Z\nprotocol: TLSv1.3\nkeyType: ec\nhostnameMatches: yes\nauthorized: yes",
                    "securityTxt": "Contact: mailto:security@example.net\nExpires: 2026-03-01T00:00:00Z\nPreferred-Languages: en",
                    "httpsRedirect": "yes"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SecurityConfigurationScannerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/http-technology-explorer/calculate": {
      "post": {
        "operationId": "calculateHttpTechnologyExplorer",
        "summary": "Headers, compression, caching, HTTP/2-3 hints, redirects, security and tech stack for a URL.",
        "description": "Fetches a public URL (or analyses pasted raw response headers and HTML) and explains what the response reveals: redirect target and HTTPS upgrade, HTTP/2 and HTTP/3 advertisement (Alt-Svc), compression, caching (Cache-Control, ETag, Last-Modified, Age, Vary), security headers, and server, framework, CMS and analytics fingerprints with a confidence level for each.\n\nMethodology:\n- Live mode: one GET of the URL through the platform's SSRF-guarded fetcher (redirects followed and re-validated, ports 80/443 only, body capped at 512 KiB), plus a small GET of the http:// variant to see whether plain HTTP is upgraded to HTTPS.\n- The fetcher speaks HTTP/1.1, so HTTP/2 and HTTP/3 support is inferred from the Alt-Svc header (h2/h3); pasted headers show the real protocol in their status line.\n- Caching follows RFC 9111: no-store, private, no-cache, s-maxage > max-age > Expires-Date; CDN-Cache-Control/Surrogate-Control override for shared caches.\n- Security headers use the same deterministic rules as HeaderLens (HSTS, CSP, nosniff, framing, Referrer-Policy, Permissions-Policy, validators, Vary, compression, version disclosure).\n- Technology fingerprints come from response headers (Server, X-Powered-By, vendor headers) and HTML markers (meta generator, well-known asset paths such as /wp-content/, /_next/static/, /_nuxt/). Confidence: high = explicit self-identification, medium = characteristic path, low = weak hint.",
        "tags": [
          "infrastructure"
        ],
        "x-mcp-tool": "http_technology_explorer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HttpTechnologyExplorerInput"
              },
              "examples": {
                "example1": {
                  "summary": "WordPress shop behind nginx (pasted)",
                  "value": {
                    "mode": "paste",
                    "rawHeaders": "HTTP/1.1 301 Moved Permanently\nLocation: https://www.example-shop.test/\nServer: nginx\n\nHTTP/2 200\nserver: nginx/1.24.0\ndate: Mon, 12 Oct 2026 10:00:00 GMT\ncontent-type: text/html; charset=UTF-8\ncontent-encoding: br\nvary: Accept-Encoding, Cookie\ncache-control: public, max-age=300, s-maxage=600\netag: \"5f2a-63c1\"\nlast-modified: Mon, 12 Oct 2026 09:30:00 GMT\nage: 42\nx-powered-by: PHP/8.2.12\nlink: <https://www.example-shop.test/wp-json/>; rel=\"https://api.w.org/\"\nalt-svc: h3=\":443\"; ma=86400\nstrict-transport-security: max-age=31536000; includeSubDomains\nx-content-type-options: nosniff\nreferrer-policy: strict-origin-when-cross-origin\nset-cookie: session=abc123; Path=/; Secure; HttpOnly; SameSite=Lax",
                    "html": "<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"><title>Example shop</title>\n<meta name=\"generator\" content=\"WordPress 6.6.2\">\n<link rel=\"stylesheet\" href=\"/wp-content/themes/shop/style.css\">\n<script src=\"/wp-includes/js/jquery/jquery.min.js?ver=3.7.1\"></script>\n<script async src=\"https://www.googletagmanager.com/gtag/js?id=G-TEST123\"></script>\n</head><body><h1>Example shop</h1></body></html>"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpTechnologyExplorerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/cdn-behavior-explorer/calculate": {
      "post": {
        "operationId": "calculateCdnBehaviorExplorer",
        "summary": "Which CDN serves a URL, whether it caches it (HIT/MISS, Age, TTL) and how, from two requests.",
        "description": "Sends two consecutive requests to a public URL (or reads two pasted header sets) and compares them: CDN detection from vendor headers (Cloudflare, CloudFront, Fastly, Akamai, Vercel, Netlify, Bunny, Azure, Google), edge cache status HIT/MISS/EXPIRED, Age progression, edge location, shared-cache TTL, Vary and compression. Only this server's vantage point is used; there is no multi-region comparison.\n\nMethodology:\n- Live mode: two GET requests in a row through the SSRF-guarded fetcher (body capped at 64 KiB each), identical request headers.\n- CDN detection from vendor headers: cf-ray/cf-cache-status (Cloudflare), x-amz-cf-id/x-amz-cf-pop (CloudFront), x-served-by cache-xxx/x-fastly-request-id (Fastly), akamai-grn/x-akamai-*/AkamaiGHost (Akamai), x-vercel-id, x-nf-request-id, BunnyCDN, x-azure-ref, Via: google.\n- Cache status from the vendor header or RFC 9211 Cache-Status (the last listed cache is closest to the client); Age (RFC 9111 §5.1) growing between requests means one stored copy answered both.\n- TTL: CDN-Cache-Control / Surrogate-Control > s-maxage > max-age > Expires − Date. Browser TTL is max-age.\n- Region comparison is not available: tools run from one server. HeaderLens has multi-region probe agents, but they are not wired into tools.",
        "tags": [
          "infrastructure"
        ],
        "x-mcp-tool": "cdn_behavior_explorer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CdnBehaviorExplorerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Cloudflare MISS then HIT (pasted)",
                  "value": {
                    "mode": "paste",
                    "headersFirst": "HTTP/2 200\ndate: Mon, 12 Oct 2026 10:00:00 GMT\ncontent-type: text/html; charset=utf-8\ncontent-encoding: br\ncache-control: public, max-age=60, s-maxage=3600\netag: W/\"abc123\"\nvary: Accept-Encoding\ncf-cache-status: MISS\nage: 0\ncf-ray: 8d2f1a2b3c4d5e6f-FRA\nserver: cloudflare\nalt-svc: h3=\":443\"; ma=86400",
                    "headersSecond": "HTTP/2 200\ndate: Mon, 12 Oct 2026 10:00:05 GMT\ncontent-type: text/html; charset=utf-8\ncontent-encoding: br\ncache-control: public, max-age=60, s-maxage=3600\netag: W/\"abc123\"\nvary: Accept-Encoding\ncf-cache-status: HIT\nage: 5\ncf-ray: 8d2f1a2c4e5f6a7b-FRA\nserver: cloudflare\nalt-svc: h3=\":443\"; ma=86400"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CdnBehaviorExplorerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ipv6-readiness-explorer/calculate": {
      "post": {
        "operationId": "calculateIpv6ReadinessExplorer",
        "summary": "Is a domain reachable over IPv6? Web, DNS and mail checks, address classes and a scored report.",
        "description": "Checks AAAA records for a domain and its www host, IPv6 addresses of its name servers and mail servers, classifies every IPv6 address (global unicast vs ULA, link-local, documentation, 6to4, Teredo, NAT64 …), optionally opens a TCP connection to port 443 over IPv6, and turns it into a score with every check explained.\n\nMethodology:\n- Resolves A and AAAA for the domain and www.<domain>, the NS host names and the MX host names (up to 10) with this server's resolver.\n- Every IPv6 address is classified against the IANA IPv6 special-purpose registry: only global unicast (2000::/3 minus special blocks) is reachable from the internet.\n- Score (points, n/a checks are excluded from the maximum): apex AAAA 25, www AAAA 15, any name server with IPv6 20, all name servers with IPv6 10, MX with IPv6 15 (pro rata), no special-purpose addresses 5, TCP 443 over IPv6 10. Grade A ≥ 90, B ≥ 75, C ≥ 50, D ≥ 25.\n- Connect test: up to 3 global AAAA addresses of the domain/www, TCP handshake on port 443 with a 5 s timeout. If this server itself has no IPv6 route (ENETUNREACH/EADDRNOTAVAIL), the test is reported as not possible instead of counted as a failure.",
        "tags": [
          "infrastructure"
        ],
        "x-mcp-tool": "ipv6_readiness_explorer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Ipv6ReadinessExplorerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Pasted record set: partial IPv6",
                  "value": {
                    "mode": "pasted",
                    "pasted": "{\n \"domain\": \"example.net\",\n \"hosts\": [\n  {\n   \"name\": \"example.net\",\n   \"ipv4\": [\n    \"93.184.215.14\"\n   ],\n   \"ipv6\": [\n    \"2606:2800:21f:cb07:6820:80da:af6b:8b2c\"\n   ]\n  },\n  {\n   \"name\": \"www.example.net\",\n   \"ipv4\": [\n    \"93.184.215.14\"\n   ],\n   \"ipv6\": []\n  }\n ],\n \"nameservers\": [\n  {\n   \"name\": \"ns1.dns-host.example\",\n   \"ipv4\": [\n    \"198.51.100.53\"\n   ],\n   \"ipv6\": [\n    \"2a00:1450:4001:c0f::35\"\n   ]\n  },\n  {\n   \"name\": \"ns2.dns-host.example\",\n   \"ipv4\": [\n    \"203.0.113.53\"\n   ],\n   \"ipv6\": []\n  }\n ],\n \"mx\": [\n  {\n   \"name\": \"mail.example.net\",\n   \"priority\": 10,\n   \"ipv4\": [\n    \"198.51.100.25\"\n   ],\n   \"ipv6\": [\n    \"fd00:25::1\"\n   ]\n  }\n ],\n \"connect\": [\n  {\n   \"host\": \"example.net\",\n   \"address\": \"2606:2800:21f:cb07:6820:80da:af6b:8b2c\",\n   \"ok\": false,\n   \"code\": \"ENETUNREACH\",\n   \"ms\": null\n  }\n ]\n}"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Ipv6ReadinessExplorerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/global-dns-explorer/calculate": {
      "post": {
        "operationId": "calculateGlobalDnsExplorer",
        "summary": "Ask every authoritative name server and public resolvers: records, propagation, DNSSEC, mistakes.",
        "description": "Queries each authoritative name server of a domain directly and compares the answers with Google and Cloudflare DNS-over-HTTPS and the local resolver. Shows SOA serial drift (propagation in progress), DNSSEC validation, lame delegation, CNAME at the apex, glue hints, TTLs, and what changed since the previous check.\n\nMethodology:\n- Finds the zone (walking up from the host name until NS records exist) and resolves every name server to its addresses with the server's resolver.\n- Queries SOA, NS, A, AAAA, CNAME, MX, TXT and CAA directly at each authoritative name server (first public IPv4 address; private addresses are never contacted), at Google and Cloudflare DNS-over-HTTPS and at the local resolver.\n- Propagation: different SOA serials between authoritative servers mean secondaries have not yet transferred the latest zone; public resolvers answering differently hold cached data until the TTL expires (or serve location-dependent answers).\n- Lame delegation: a listed name server that refuses, fails (SERVFAIL/NXDOMAIN) or returns no SOA for the zone. Glue: in-zone name servers need A/AAAA glue at the parent; a name server name that does not resolve is flagged.\n- DNSSEC: DS record at the parent (Google DoH) plus the AD (authenticated data) flag from Google and Cloudflare; DS present but SERVFAIL everywhere = bogus.\n- History: each live check stores a snapshot of the authoritative records under sha256(domain); the next check lists added/removed values per record type (up to 20 snapshots kept).",
        "tags": [
          "infrastructure"
        ],
        "x-mcp-tool": "global_dns_explorer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GlobalDnsExplorerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Pasted answers: propagation in progress + lame server",
                  "value": {
                    "mode": "pasted",
                    "pasted": "{\n \"domain\": \"example.net\",\n \"zone\": \"example.net\",\n \"dsPresent\": true,\n \"nameservers\": [\n  {\n   \"name\": \"ns1.example.net\",\n   \"addresses\": [\n    \"192.0.2.53\"\n   ]\n  },\n  {\n   \"name\": \"ns2.dns-host.example\",\n   \"addresses\": [\n    \"198.51.100.53\"\n   ]\n  },\n  {\n   \"name\": \"ns3.dns-host.example\",\n   \"addresses\": [\n    \"203.0.113.53\"\n   ]\n  }\n ],\n \"resolvers\": [\n  {\n   \"id\": \"ns:ns1.example.net\",\n   \"label\": \"ns1.example.net (192.0.2.53)\",\n   \"kind\": \"authoritative\",\n   \"status\": \"ok\",\n   \"records\": {\n    \"SOA\": {\n     \"values\": [\n      \"ns1.example.net hostmaster.example.net 2026101402 7200 3600 1209600 3600\"\n     ]\n    },\n    \"NS\": {\n     \"values\": [\n      \"ns1.example.net\",\n      \"ns2.dns-host.example\",\n      \"ns3.dns-host.example\"\n     ]\n    },\n    \"A\": {\n     \"values\": [\n      \"93.184.215.14\"\n     ],\n     \"ttl\": 300\n    },\n    \"AAAA\": {\n     \"values\": [],\n     \"ttl\": null\n    },\n    \"MX\": {\n     \"values\": [\n      \"10 mail.example.net\"\n     ]\n    },\n    \"TXT\": {\n     \"values\": [\n      \"v=spf1 mx -all\"\n     ]\n    },\n    \"CAA\": {\n     \"values\": [\n      \"0 issue \\\"letsencrypt.org\\\"\"\n     ]\n    },\n    \"CNAME\": {\n     \"values\": []\n    }\n   }\n  },\n  {\n   \"id\": \"ns:ns2.dns-host.example\",\n   \"label\": \"ns2.dns-host.example (198.51.100.53)\",\n   \"kind\": \"authoritative\",\n   \"status\": \"ok\",\n   \"records\": {\n    \"SOA\": {\n     \"values\": [\n      \"ns1.example.net hostmaster.example.net 2026101401 7200 3600 1209600 3600\"\n     ]\n    },\n    \"NS\": {\n     \"values\": [\n      \"ns1.example.net\",\n      \"ns2.dns-host.example\",\n      \"ns3.dns-host.example\"\n     ]\n    },\n    \"A\": {\n     \"values\": [\n      \"93.184.216.34\"\n     ],\n     \"ttl\": 300\n    },\n    \"AAAA\": {\n     \"values\": []\n    },\n    \"MX\": {\n     \"values\": [\n      \"10 mail.example.net\"\n     ]\n    },\n    \"TXT\": {\n     \"values\": [\n      \"v=spf1 mx -all\"\n     ]\n    },\n    \"CAA\": {\n     \"values\": [\n      \"0 issue \\\"letsencrypt.org\\\"\"\n     ]\n    },\n    \"CNAME\": {\n     \"values\": []\n    }\n   }\n  },\n  {\n   \"id\": \"ns:ns3.dns-host.example\",\n   \"label\": \"ns3.dns-host.example (203.0.113.53)\",\n   \"kind\": \"authoritative\",\n   \"status\": \"refused\",\n   \"error\": \"EREFUSED\",\n   \"records\": {}\n  },\n  {\n   \"id\": \"doh:google\",\n   \"label\": \"Google Public DNS (DoH)\",\n   \"kind\": \"public-doh\",\n   \"status\": \"ok\",\n   \"ad\": true,\n   \"records\": {\n    \"SOA\": {\n     \"values\": [\n      \"ns1.example.net. hostmaster.example.net. 2026101401 7200 3600 1209600 3600\"\n     ],\n     \"ttl\": 1800\n    },\n    \"NS\": {\n     \"values\": [\n      \"ns1.example.net.\",\n      \"ns2.dns-host.example.\",\n      \"ns3.dns-host.example.\"\n     ],\n     \"ttl\": 86400\n    },\n    \"A\": {\n     \"values\": [\n      \"93.184.216.34\"\n     ],\n     \"ttl\": 212\n    },\n    \"MX\": {\n     \"values\": [\n      \"10 mail.example.net.\"\n     ],\n     \"ttl\": 3600\n    },\n    \"TXT\": {\n     \"values\": [\n      \"\\\"v=spf1 mx -all\\\"\"\n     ],\n     \"ttl\": 3600\n    },\n    \"CAA\": {\n     \"values\": [\n      \"0 issue \\\"letsencrypt.org\\\"\"\n     ],\n     \"ttl\": 3600\n    },\n    \"AAAA\": {\n     \"values\": []\n    },\n    \"CNAME\": {\n     \"values\": []\n    }\n   }\n  },\n  {\n   \"id\": \"doh:cloudflare\",\n   \"label\": \"Cloudflare 1.1.1.1 (DoH)\",\n   \"kind\": \"public-doh\",\n   \"status\": \"ok\",\n   \"ad\": true,\n   \"records\": {\n    \"SOA\": {\n     \"values\": [\n      \"ns1.example.net. hostmaster.example.net. 2026101402 7200 3600 1209600 3600\"\n     ],\n     \"ttl\": 3600\n    },\n    \"A\": {\n     \"values\": [\n      \"93.184.215.14\"\n     ],\n     \"ttl\": 300\n    },\n    \"MX\": {\n     \"values\": [\n      \"10 mail.example.net.\"\n     ],\n     \"ttl\": 3600\n    }\n   }\n  }\n ]\n}",
                    "trackChanges": false
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GlobalDnsExplorerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/certificate-transparency-explorer/calculate": {
      "post": {
        "operationId": "calculateCertificateTransparencyExplorer",
        "summary": "Every logged certificate for a domain: history, issuers, subdomains, wildcards and expiry.",
        "description": "Searches Certificate Transparency logs (via crt.sh) for a domain and its subdomains, de-duplicates precertificates, and shows the issuance timeline, which CAs issued over time, subdomains discovered from SANs, wildcard usage, names whose certificates are expiring or expired, and a graph of certificates and the names they cover.\n\nMethodology:\n- Live: crt.sh JSON search for the exact domain and (optionally) %.domain, which matches every name below it; both queries run in parallel with a 20 s timeout.\n- Precertificates and final certificates share issuer + serial number and are merged into one certificate; names come from the common name and SAN list.\n- Per name: first/last issuance and the latest expiry over all certificates. A name is \"expiring\" when its newest certificate expires within the chosen window and no later certificate has been logged yet.\n- Issuers are grouped by the issuer organisation (O=) per year of notBefore. \"Other domains\" are names on the same certificates outside the searched domain (naive last-two-labels grouping).\n- The graph shows the latest 14 certificates and their names (capped at ~60 nodes).",
        "tags": [
          "infrastructure"
        ],
        "x-mcp-tool": "certificate_transparency_explorer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CertificateTransparencyExplorerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Pasted crt.sh results for example.net",
                  "value": {
                    "mode": "pasted",
                    "domain": "example.net",
                    "expiringWithinDays": 30,
                    "pasted": "[{\"issuer_ca_id\":432477,\"issuer_name\":\"C=US, O=Let's Encrypt, CN=YR2\",\"common_name\":\"www.example.net\",\"name_value\":\"example.net\\nwww.example.net\",\"id\":29441194038,\"not_before\":\"2026-08-31T23:14:22\",\"not_after\":\"2026-11-29T23:14:21\",\"serial_number\":\"05394f07b853bc55043a45be26fcc01e7d10\"},{\"issuer_ca_id\":432477,\"issuer_name\":\"C=US, O=Let's Encrypt, CN=YR2\",\"common_name\":\"www.example.net\",\"name_value\":\"example.net\\nwww.example.net\",\"id\":29750973274,\"not_before\":\"2026-08-31T23:14:22\",\"not_after\":\"2026-11-29T23:14:21\",\"serial_number\":\"05394f07b853bc55043a45be26fcc01e7d10\"},{\"issuer_ca_id\":432476,\"issuer_name\":\"C=US, O=Let's Encrypt, CN=YR1\",\"common_name\":\"memo.example.net\",\"name_value\":\"memo.example.net\",\"id\":28975558547,\"not_before\":\"2026-08-20T22:27:54\",\"not_after\":\"2026-11-18T22:27:53\",\"serial_number\":\"0554fec7bbaa27fd29acf1bd736e4ad55adc\"},{\"issuer_ca_id\":413868,\"issuer_name\":\"C=US, O=SSL Corporation, CN=Cloudflare TLS Issuing ECC CA 3\",\"common_name\":\"example.net\",\"name_value\":\"*.example.net\\nexample.net\",\"id\":27000000001,\"not_before\":\"2026-07-20T10:00:00\",\"not_after\":\"2026-10-18T10:00:00\",\"serial_number\":\"0ffbc4fba7b8b237ecfda4bf0719133f\"},{\"issuer_ca_id\":432477,\"issuer_name\":\"C=US, O=Let's Encrypt, CN=YR2\",\"common_name\":\"www.example.net\",\"name_value\":\"example.net\\nwww.example.net\",\"id\":27653267941,\"not_before\":\"2026-07-02T22:25:03\",\"not_after\":\"2026-09-30T22:25:02\",\"serial_number\":\"05caf9fdeb36a0076ab7c98d1553a4e1\"},{\"issuer_ca_id\":183267,\"issuer_name\":\"C=US, O=Let's Encrypt, CN=R3\",\"common_name\":\"old-shop.example.net\",\"name_value\":\"old-shop.example.net\\nshop.partner-store.example\",\"id\":9000000001,\"not_before\":\"2023-03-01T08:00:00\",\"not_after\":\"2023-05-30T08:00:00\",\"serial_number\":\"03aa11bb22cc33dd44ee55ff66778899aabb\"},{\"issuer_ca_id\":1449,\"issuer_name\":\"C=US, O=DigiCert Inc, CN=DigiCert TLS RSA SHA256 2020 CA1\",\"common_name\":\"example.net\",\"name_value\":\"example.net\\nwww.example.net\",\"id\":5000000001,\"not_before\":\"2021-12-10T00:00:00\",\"not_after\":\"2023-01-10T23:59:59\",\"serial_number\":\"0a1b2c3d4e5f60718293a4b5c6d7e8f9\"}]"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CertificateTransparencyExplorerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/domain-history-graph/calculate": {
      "post": {
        "operationId": "calculateDomainHistoryGraph",
        "summary": "Registration, DNS, hosting networks, certificates and Wayback captures of a domain as a timeline.",
        "description": "Combines public records about a domain: RDAP registration data (registrar, registration/expiry/last-changed dates, status, name servers, DNSSEC), current A/AAAA/NS/MX records and the networks (ASNs) hosting its addresses via RIPEstat, Certificate Transparency history from crt.sh and first/last Wayback Machine captures. Shows a timeline and a relationship graph. Contact names, e-mails and phone numbers are never displayed.\n\nMethodology:\n- RDAP (RFC 9083) via the rdap.org bootstrap redirector, which forwards to the authoritative registry/registrar RDAP server. Only registrar, dates, status, name servers, DNSSEC and — if published — the registrant organisation and country are shown; contact names, e-mails, phone numbers and street addresses are dropped and only counted.\n- Current DNS (A, AAAA, NS, MX) from this server's resolver; hosting network per public address via RIPEstat network-info (origin ASN + prefix) and as-overview (holder name).\n- Certificate Transparency: crt.sh JSON for the exact domain, deduplicated by serial: first certificate seen, latest issuance, issuing organisations, distinct names.\n- Wayback Machine CDX API: the 10 oldest and 10 newest captures (fl=timestamp,statuscode,digest); digest changes between samples indicate content changes. Totals across all captures are not computed (the index is too large to count cheaply).\n- Paste mode uses the RDAP \"last update of RDAP database\" event as the reference time for age/expiry so results do not depend on when you run it.",
        "tags": [
          "infrastructure"
        ],
        "x-mcp-tool": "domain_history_graph",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DomainHistoryGraphInput"
              },
              "examples": {
                "example1": {
                  "summary": "example.com from pasted RDAP + CDX",
                  "value": {
                    "mode": "paste",
                    "domain": "example.com",
                    "rdapJson": "{\n \"objectClassName\": \"domain\",\n \"ldhName\": \"EXAMPLE.COM\",\n \"status\": [\n  \"client delete prohibited\",\n  \"client transfer prohibited\",\n  \"client update prohibited\"\n ],\n \"links\": [\n  {\n   \"rel\": \"self\",\n   \"href\": \"https://rdap.verisign.com/com/v1/domain/example.com\"\n  }\n ],\n \"entities\": [\n  {\n   \"objectClassName\": \"entity\",\n   \"handle\": \"376\",\n   \"roles\": [\n    \"registrar\"\n   ],\n   \"publicIds\": [\n    {\n     \"type\": \"IANA Registrar ID\",\n     \"identifier\": \"376\"\n    }\n   ],\n   \"vcardArray\": [\n    \"vcard\",\n    [\n     [\n      \"version\",\n      {},\n      \"text\",\n      \"4.0\"\n     ],\n     [\n      \"fn\",\n      {},\n      \"text\",\n      \"RESERVED-Internet Assigned Numbers Authority\"\n     ]\n    ]\n   ],\n   \"entities\": [\n    {\n     \"objectClassName\": \"entity\",\n     \"roles\": [\n      \"abuse\"\n     ],\n     \"vcardArray\": [\n      \"vcard\",\n      [\n       [\n        \"version\",\n        {},\n        \"text\",\n        \"4.0\"\n       ],\n       [\n        \"fn\",\n        {},\n        \"text\",\n        \"\"\n       ],\n       [\n        \"tel\",\n        {\n         \"type\": \"voice\"\n        },\n        \"uri\",\n        \"tel:+1.3105551234\"\n       ],\n       [\n        \"email\",\n        {},\n        \"text\",\n        \"abuse@registrar.example\"\n       ]\n      ]\n     ]\n    }\n   ]\n  }\n ],\n \"events\": [\n  {\n   \"eventAction\": \"registration\",\n   \"eventDate\": \"1995-08-14T04:00:00Z\"\n  },\n  {\n   \"eventAction\": \"expiration\",\n   \"eventDate\": \"2027-08-13T04:00:00Z\"\n  },\n  {\n   \"eventAction\": \"last changed\",\n   \"eventDate\": \"2026-08-14T08:01:43Z\"\n  },\n  {\n   \"eventAction\": \"last update of RDAP database\",\n   \"eventDate\": \"2026-10-14T14:23:10Z\"\n  }\n ],\n \"secureDNS\": {\n  \"delegationSigned\": true\n },\n \"nameservers\": [\n  {\n   \"objectClassName\": \"nameserver\",\n   \"ldhName\": \"ELLIOTT.NS.CLOUDFLARE.COM\"\n  },\n  {\n   \"objectClassName\": \"nameserver\",\n   \"ldhName\": \"HERA.NS.CLOUDFLARE.COM\"\n  }\n ]\n}",
                    "cdxRows": "[[\"timestamp\",\"statuscode\",\"digest\"],\n[\"20020120142510\",\"200\",\"HT2DYGA5UKZCPBSFVCV3JOBXGW2G5UUA\"],\n[\"20020328012821\",\"200\",\"UY3I2DT2AMWAY6DECFCFYMT5ZOTFHUCH\"],\n[\"20020524041628\",\"200\",\"UY3I2DT2AMWAY6DECFCFYMT5ZOTFHUCH\"],\n[\"20261014031041\",\"200\",\"U2352G3H6BFNEDPBNQI5XGOBSQAN4W4J\"],\n[\"20261014041142\",\"200\",\"U2352G3H6BFNEDPBNQI5XGOBSQAN4W4J\"],\n[\"20261014064636\",\"200\",\"U2352G3H6BFNEDPBNQI5XGOBSQAN4W4J\"]]"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DomainHistoryGraphResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/bgp-route-explorer/calculate": {
      "post": {
        "operationId": "calculateBgpRouteExplorer",
        "summary": "Who announces an IP or prefix in BGP: origin ASes, RPKI validity, visibility and origin changes.",
        "description": "Looks up an IP address or prefix in RIPE RIS via the RIPEstat Data API: the covering announced prefix, origin AS(es) and holders, RPKI ROV state per origin, visibility among RIS full-feed peers, first/last seen, more-specifics announced by others, a timeline of origin changes and sample AS paths with upstreams.\n\nMethodology:\n- prefix-overview: the announced prefix covering the input (aligned to the first less-specific if the exact one is not announced), origin AS(es) and holder names.\n- routing-status: visibility = RIS full-feed peers seeing the prefix ÷ all RIS full-feed peers of that address family; first/last seen; more- and less-specific announcements; IRR route objects.\n- routing-history: per origin and prefix, the periods RIS saw the announcement (routes seen by fewer than 10 full-feed peers are excluded by RIPEstat); start/stop events form the origin timeline. Covering prefixes (e.g. bogus /3 or /8 leaks) also appear and are marked as related.\n- rpki-validation: Routinator's ROV state for each origin AS + prefix (valid, invalid_asn, invalid_length, unknown = no covering ROA).\n- looking-glass (optional): current AS paths at RIS collectors; the AS immediately before the origin in each path is counted as an observed upstream.",
        "tags": [
          "infrastructure"
        ],
        "x-mcp-tool": "bgp_route_explorer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BgpRouteExplorerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Pasted RIPEstat data for 193.0.0.0/21 (RIPE NCC)",
                  "value": {
                    "mode": "pasted",
                    "pasted": "{\"resource\":\"193.0.6.139\",\"prefixOverview\":{\"data\":{\"is_less_specific\":true,\"announced\":true,\"asns\":[{\"asn\":3333,\"holder\":\"RIPE-NCC-AS Reseaux IP Europeens Network Coordination Centre (RIPE NCC)\"}],\"resource\":\"193.0.0.0/21\",\"block\":{\"resource\":\"193.0.0.0/8\",\"desc\":\"RIPE NCC (Status: ALLOCATED)\"}}},\"routingStatus\":{\"data\":{\"first_seen\":{\"prefix\":\"193.0.0.0/21\",\"origin\":\"3333\",\"time\":\"2000-10-31T00:00:00\"},\"last_seen\":{\"prefix\":\"193.0.0.0/21\",\"origin\":\"3333\",\"time\":\"2026-10-14T08:00:00\"},\"visibility\":{\"v4\":{\"ris_peers_seeing\":327,\"total_ris_peers\":327},\"v6\":{\"ris_peers_seeing\":0,\"total_ris_peers\":0}},\"origins\":[{\"origin\":3333,\"route_objects\":[\"RIPE\"]}],\"less_specifics\":[],\"more_specifics\":[],\"resource\":\"193.0.0.0/21\"}},\"routingHistory\":{\"data\":{\"resource\":\"193.0.0.0/21\",\"query_starttime\":\"2000-08-01T00:00:00\",\"query_endtime\":\"2026-10-14T08:00:00\",\"time_granularity\":1036800,\"by_origin\":[{\"origin\":\"3333\",\"prefixes\":[{\"prefix\":\"193.0.0.0/21\",\"timelines\":[{\"starttime\":\"2000-10-26T00:00:00\",\"endtime\":\"2000-11-06T23:59:59\",\"full_peers_seeing\":28},{\"starttime\":\"2001-01-18T00:00:00\",\"endtime\":\"2026-10-14T08:00:00\",\"full_peers_seeing\":327}]},{\"prefix\":\"193.0.0.0/22\",\"timelines\":[{\"starttime\":\"2000-08-15T00:00:00\",\"endtime\":\"2000-09-07T23:59:59\",\"full_peers_seeing\":12}]}]},{\"origin\":\"3352\",\"prefixes\":[{\"prefix\":\"193.0.0.0/8\",\"timelines\":[{\"starttime\":\"2007-08-15T00:00:00\",\"endtime\":\"2007-08-26T23:59:59\",\"full_peers_seeing\":40}]}]},{\"origin\":\"15962\",\"prefixes\":[{\"prefix\":\"192.0.0.0/3\",\"timelines\":[{\"starttime\":\"2020-08-06T00:00:00\",\"endtime\":\"2020-08-17T23:59:59\",\"full_peers_seeing\":11}]}]}]}},\"rpki\":[{\"origin\":3333,\"data\":{\"data\":{\"resource\":\"3333\",\"prefix\":\"193.0.0.0/21\",\"validating_roas\":[{\"origin\":\"3333\",\"prefix\":\"193.0.0.0/21\",\"validity\":\"valid\",\"max_length\":21}],\"status\":\"valid\",\"validator\":\"routinator\"}}}],\"lookingGlass\":{\"data\":{\"rrcs\":[{\"rrc\":\"RRC01\",\"location\":\"London, GB\",\"peers\":[{\"asn_origin\":\"3333\",\"as_path\":\"15692 174 1273 3333\",\"prefix\":\"193.0.0.0/21\",\"peer\":\"5.57.80.113\",\"last_updated\":\"2026-10-08T22:38:44\"},{\"asn_origin\":\"3333\",\"as_path\":\"8218 3333\",\"prefix\":\"193.0.0.0/21\",\"peer\":\"5.57.80.210\",\"last_updated\":\"2026-09-01T20:43:50\"},{\"asn_origin\":\"3333\",\"as_path\":\"48070 20562 1103 1103 3333\",\"prefix\":\"193.0.0.0/21\",\"peer\":\"5.57.80.99\",\"last_updated\":\"2026-10-08T20:43:29\"}]}]}}}"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BgpRouteExplorerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/asn-relationship-explorer/calculate": {
      "post": {
        "operationId": "calculateAsnRelationshipExplorer",
        "summary": "An autonomous system at a glance: holder, country, BGP neighbours and announced prefixes.",
        "description": "Explains an Autonomous System Number with RIPEstat data: registered holder and country, neighbours observed in RIPE RIS AS paths (left = towards the collectors, typically upstreams/peers; right = towards the origin, typically customers), announced IPv4/IPv6 prefixes with address-space totals, and a neighbour graph.\n\nMethodology:\n- as-overview: registered holder and whether the AS is announced; rir-stats-country: country of the registration (RIR statistics), not where the network operates.\n- asn-neighbours: ASes adjacent to this AS in RIS AS paths. Per RIPEstat, \"left\" neighbours appear between this AS and the RIS collector (typically its upstream providers or peers) and \"right\" neighbours appear between it and the origin (typically customers). \"Uncertain\" = seen on the left only as direct peers of a RIS collector. \"Power\" = how often the adjacency was observed. Public BGP data cannot reliably separate peers from providers.\n- announced-prefixes: prefixes originated by the AS over RIPEstat's default window (last 2 weeks); totals in /24 (IPv4) and /48 (IPv6) equivalents.\n- Live mode also looks up holder names of the 10 strongest neighbours (as-overview).",
        "tags": [
          "infrastructure"
        ],
        "x-mcp-tool": "asn_relationship_explorer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AsnRelationshipExplorerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Pasted RIPEstat data for AS3333 (RIPE NCC)",
                  "value": {
                    "mode": "pasted",
                    "maxNeighbours": 25,
                    "pasted": "{\"asn\":\"AS3333\",\"asOverview\":{\"data\":{\"type\":\"as\",\"resource\":\"3333\",\"block\":{\"resource\":\"3154-3353\",\"desc\":\"Assigned by RIPE NCC\",\"name\":\"IANA 16-bit Autonomous System (AS) Numbers Registry\"},\"holder\":\"RIPE-NCC-AS Reseaux IP Europeens Network Coordination Centre (RIPE NCC)\",\"announced\":true}},\"asnNeighbours\":{\"data\":{\"resource\":\"3333\",\"query_endtime\":\"2026-10-14T00:00:00\",\"neighbour_counts\":{\"left\":5,\"right\":1,\"unique\":7,\"uncertain\":1},\"neighbours\":[{\"asn\":1103,\"type\":\"left\",\"power\":14821,\"v4_peers\":81016,\"v6_peers\":7309},{\"asn\":1273,\"type\":\"left\",\"power\":7548,\"v4_peers\":74920,\"v6_peers\":27694},{\"asn\":1136,\"type\":\"left\",\"power\":4442,\"v4_peers\":40372,\"v6_peers\":5525},{\"asn\":12859,\"type\":\"left\",\"power\":2512,\"v4_peers\":17420,\"v6_peers\":1059},{\"asn\":8218,\"type\":\"uncertain\",\"power\":40,\"v4_peers\":300,\"v6_peers\":10},{\"asn\":14840,\"type\":\"left\",\"power\":2,\"v4_peers\":30,\"v6_peers\":0},{\"asn\":197000,\"type\":\"right\",\"power\":120,\"v4_peers\":900,\"v6_peers\":700}]}},\"announcedPrefixes\":{\"data\":{\"resource\":\"3333\",\"query_starttime\":\"2026-09-30T08:00:00\",\"query_endtime\":\"2026-10-14T08:00:00\",\"prefixes\":[{\"prefix\":\"2a13:27c0::/44\",\"timelines\":[{\"starttime\":\"2026-09-30T08:00:00\",\"endtime\":\"2026-10-07T00:00:00\"},{\"starttime\":\"2026-10-07T16:00:00\",\"endtime\":\"2026-10-14T08:00:00\"}]},{\"prefix\":\"193.0.18.0/23\",\"timelines\":[{\"starttime\":\"2026-09-30T08:00:00\",\"endtime\":\"2026-10-14T08:00:00\"}]},{\"prefix\":\"193.0.22.0/23\",\"timelines\":[{\"starttime\":\"2026-09-30T08:00:00\",\"endtime\":\"2026-10-14T08:00:00\"}]},{\"prefix\":\"193.0.0.0/21\",\"timelines\":[{\"starttime\":\"2026-09-30T08:00:00\",\"endtime\":\"2026-10-14T08:00:00\"}]},{\"prefix\":\"2001:67c:2e8::/48\",\"timelines\":[{\"starttime\":\"2026-09-30T08:00:00\",\"endtime\":\"2026-10-14T08:00:00\"}]}]}},\"rirStatsCountry\":{\"data\":{\"located_resources\":[{\"resource\":\"3333\",\"location\":\"NL\"}]}}}"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AsnRelationshipExplorerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/internet-outage-atlas/calculate": {
      "post": {
        "operationId": "calculateInternetOutageAtlas",
        "summary": "Correlate public outage signals (IODA, RIPEstat BGP, live probe) for a country, ASN or domain.",
        "description": "Builds a timeline of internet disruptions for a country, network (ASN) or domain by correlating IODA outage alerts and events (BGP, active probing, telescope, traffic signals from Georgia Tech), RIPEstat routing visibility and BGP update bursts, and a direct reachability probe of the domain. Overlapping signals from independent sources are marked as corroborated; single-signal events stay flagged as uncertain.\n\nMethodology:\n- IODA (Internet Outage Detection and Analysis, Georgia Tech) v2 API: /outages/alerts and /outages/events for entityType country or asn over the look-back window. IODA compares BGP-visible /24 blocks, active-probing responses, darknet telescope traffic and Google/Mozilla traffic against their recent history.\n- Alerts are paired per data source (non-normal alert → next \"normal\" alert) into episodes; an episode without a recovery alert is treated as ongoing.\n- For ASNs (and the ASN hosting a domain's first public IPv4/IPv6 address, via RIPEstat network-info) RIPEstat routing-status gives RIS peer visibility and announced prefixes; bgp-update-activity hours above max(3 × median, 100) updates are flagged as BGP bursts.\n- Domains are also probed directly with one HTTPS GET from this server (reachable = any HTTP response below 500).\n- Intervals from different sources that overlap (30-minute slack) are merged into incidents; ≥2 independent signals = corroborated, otherwise single-signal (could be measurement noise).",
        "tags": [
          "infrastructure"
        ],
        "x-mcp-tool": "internet_outage_atlas",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InternetOutageAtlasInput"
              },
              "examples": {
                "example1": {
                  "summary": "Pasted IODA alerts for a country (illustrative)",
                  "value": {
                    "mode": "paste",
                    "target": "IR",
                    "targetType": "country",
                    "pastedJson": "{\n \"type\": \"outages.alerts\",\n \"data\": [\n  {\n   \"datasource\": \"bgp\",\n   \"entity\": {\n    \"code\": \"IR\",\n    \"name\": \"Iran (Islamic Republic Of)\",\n    \"type\": \"country\"\n   },\n   \"time\": 1791231300,\n   \"level\": \"critical\",\n   \"condition\": \"< 0.99\",\n   \"value\": 41245,\n   \"historyValue\": 41687,\n   \"method\": \"median\"\n  },\n  {\n   \"datasource\": \"ping-slash24\",\n   \"entity\": {\n    \"code\": \"IR\",\n    \"name\": \"Iran (Islamic Republic Of)\",\n    \"type\": \"country\"\n   },\n   \"time\": 1791232200,\n   \"level\": \"critical\",\n   \"condition\": \"< 0.8\",\n   \"value\": 61200,\n   \"historyValue\": 88400,\n   \"method\": \"median\"\n  },\n  {\n   \"datasource\": \"ping-slash24\",\n   \"entity\": {\n    \"code\": \"IR\",\n    \"name\": \"Iran (Islamic Republic Of)\",\n    \"type\": \"country\"\n   },\n   \"time\": 1791241200,\n   \"level\": \"normal\",\n   \"condition\": \"normal\",\n   \"value\": 87900,\n   \"historyValue\": 88400,\n   \"method\": \"median\"\n  },\n  {\n   \"datasource\": \"bgp\",\n   \"entity\": {\n    \"code\": \"IR\",\n    \"name\": \"Iran (Islamic Republic Of)\",\n    \"type\": \"country\"\n   },\n   \"time\": 1791244200,\n   \"level\": \"normal\",\n   \"condition\": \"normal\",\n   \"value\": 41278,\n   \"historyValue\": 41687,\n   \"method\": \"median\"\n  },\n  {\n   \"datasource\": \"merit-nt\",\n   \"entity\": {\n    \"code\": \"IR\",\n    \"name\": \"Iran (Islamic Republic Of)\",\n    \"type\": \"country\"\n   },\n   \"time\": 1791727500,\n   \"level\": \"warning\",\n   \"condition\": \"< 0.9\",\n   \"value\": 1800,\n   \"historyValue\": 2100,\n   \"method\": \"median\"\n  },\n  {\n   \"datasource\": \"merit-nt\",\n   \"entity\": {\n    \"code\": \"IR\",\n    \"name\": \"Iran (Islamic Republic Of)\",\n    \"type\": \"country\"\n   },\n   \"time\": 1791728400,\n   \"level\": \"normal\",\n   \"condition\": \"normal\",\n   \"value\": 2080,\n   \"historyValue\": 2100,\n   \"method\": \"median\"\n  }\n ]\n}"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InternetOutageAtlasResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ai-website-readiness-explorer/calculate": {
      "post": {
        "operationId": "calculateAiWebsiteReadinessExplorer",
        "summary": "Can ChatGPT, Claude, Perplexity and AI agents read your website? Explainable score.",
        "description": "Checks a page the way AI crawlers and agents see it: robots.txt rules for 16 AI and search bots (training vs. search vs. user-triggered, RFC 9309 matching, Content-Signal), meta robots, whether the content exists without JavaScript, semantic structure, JSON-LD types, llms.txt, sitemap, OpenAPI/API catalog and machine-readable alternates. Every check is listed with its points, so the score is fully explainable.\n\nMethodology:\n- robots.txt is evaluated per RFC 9309 for the page path: the group naming the bot exactly is used, otherwise the * group; the longest matching rule wins (Allow on ties). Content-Signal lines are reported.\n- Access score: search and user-request bots allowed earns the access points; blocking training-only bots (GPTBot, CCBot, Google-Extended, …) is a legitimate choice and is NOT penalised.\n- Content: visible text without JavaScript (scripts/styles removed); ≥ 500 characters = server-rendered.\n- Score = earned points / possible points × 100 over all checks (each check lists its points). Grade: A ≥ 90, B ≥ 75, C ≥ 60, D ≥ 40, else F.\n- Online mode fetches the page, /robots.txt, /llms.txt, /sitemap.xml, /openapi.json and /.well-known/api-catalog (RFC 9727) once each.",
        "tags": [
          "ai-infra"
        ],
        "x-mcp-tool": "ai_website_readiness_explorer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AiWebsiteReadinessExplorerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Blog that blocks AI training but allows search (offline)",
                  "value": {
                    "html": "<!doctype html><html lang=\"en\"><head><title>Bread baking basics</title><meta name=\"description\" content=\"Step-by-step sourdough guide.\"><link rel=\"canonical\" href=\"https://bakery.example/bread\"><meta property=\"og:title\" content=\"Bread\"><meta property=\"og:type\" content=\"article\"><meta property=\"og:url\" content=\"https://bakery.example/bread\"><script type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"Article\",\"headline\":\"Bread baking basics\"}</script></head><body><header><nav><a href=\"/\">Home</a></nav></header><main><article><h1>Bread baking basics</h1><p>Sourdough needs flour, water, salt and a lively starter. Mix, rest, fold and bake in a hot oven. Sourdough needs flour, water, salt and a lively starter. Mix, rest, fold and bake in a hot oven. Sourdough needs flour, water, salt and a lively starter. Mix, rest, fold and bake in a hot oven. Sourdough needs flour, water, salt and a lively starter. Mix, rest, fold and bake in a hot oven. Sourdough needs flour, water, salt and a lively starter. Mix, rest, fold and bake in a hot oven. Sourdough needs flour, water, salt and a lively starter. Mix, rest, fold and bake in a hot oven. Sourdough needs flour, water, salt and a lively starter. Mix, rest, fold and bake in a hot oven. Sourdough needs flour, water, salt and a lively starter. Mix, rest, fold and bake in a hot oven. </p><img src=\"loaf.jpg\" alt=\"A baked loaf\"></article></main></body></html>",
                    "robotsTxt": "User-agent: GPTBot\nDisallow: /\n\nUser-agent: CCBot\nDisallow: /\n\nUser-agent: Google-Extended\nDisallow: /\n\nUser-agent: *\nAllow: /\nContent-Signal: search=yes, ai-train=no\n\nSitemap: https://bakery.example/sitemap.xml",
                    "llmsTxt": "# Bakery\n\n> Bread guides.\n\n- [Bread basics](https://bakery.example/bread)"
                  }
                },
                "example2": {
                  "summary": "JavaScript-only app shell (offline)",
                  "value": {
                    "html": "<!doctype html><html><head><title>App</title></head><body><div id=\"root\"></div><script src=\"/bundle.js\"></script></body></html>",
                    "robotsTxt": "User-agent: *\nDisallow: /admin"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AiWebsiteReadinessExplorerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/a11y-snapshot/calculate": {
      "post": {
        "operationId": "calculateA11ySnapshot",
        "summary": "Static WCAG 2.2 snapshot of a page: findings by severity, evidence and manual checks.",
        "description": "Fetch a public URL or paste HTML to get a deterministic accessibility snapshot: page language, title, image alternatives, form labels, button and link names, heading outline, landmarks, tables, iframes, zoom blocking and more — each finding mapped to a WCAG 2.2 success criterion with the offending element. It also lists what must be checked by hand.\n\nMethodology:\n- The HTML is parsed by a tolerant tokenizer/tree builder; no JavaScript is executed and no CSS is computed, so content injected by scripts is not seen.\n- 28 rules run: language, title, text alternatives, form labels, button/link names, headings, duplicate ids, viewport zoom, data tables, iframe titles, autoplaying media, landmarks, skip link, tabindex and aria-hidden misuse.\n- Each finding is classed as \"failure\" (strong evidence of a WCAG 2.2 success-criterion failure), \"best-practice\" (recommended but not a strict failure, e.g. heading order or duplicate ids — SC 4.1.1 Parsing is obsolete in WCAG 2.2) or \"needs-review\".\n- Accessible names are approximated from aria-labelledby, aria-label, label elements, content text, image alt and title, in that order.\n- Criteria that need rendering or human judgement (colour, contrast, keyboard, focus visibility, captions…) are listed as manual checks.\n\nAutomated static checks can only detect some failures. They cannot establish WCAG 2.2 conformance: conformance requires a full manual review of every page state (WCAG 2.2 §5.2), including rendered contrast, keyboard operation and assistive-technology testing.",
        "tags": [
          "developer"
        ],
        "x-mcp-tool": "a11y_snapshot",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/A11ySnapshotInput"
              },
              "examples": {
                "example1": {
                  "summary": "Landing page with common problems",
                  "value": {
                    "html": "<!doctype html>\n<html>\n<head><meta name=\"viewport\" content=\"width=device-width, user-scalable=no\"><title></title></head>\n<body>\n<div class=\"nav\"><a href=\"/\"><img src=\"logo.png\"></a> <a href=\"/shop\">Shop</a> <a href=\"/blog\">Blog</a> <a href=\"/help\">Help</a> <a href=\"/about\">About</a> <a href=\"/cart\"><svg aria-hidden=\"true\"></svg></a></div>\n<h1>Spring sale</h1>\n<h3>Newsletter</h3>\n<form><input type=\"email\" name=\"email\" placeholder=\"Your email\"><button><svg aria-hidden=\"true\"></svg></button></form>\n<p>Read our offers <a href=\"/offers\">click here</a>.</p>\n<iframe src=\"https://www.youtube.com/embed/xyz\"></iframe>\n</body>\n</html>",
                    "maxFindings": 100
                  }
                },
                "example2": {
                  "summary": "Well-structured contact page",
                  "value": {
                    "html": "<!doctype html>\n<html lang=\"en\">\n<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><title>Contact – Example Ltd</title></head>\n<body>\n<a class=\"skip-link\" href=\"#main\">Skip to main content</a>\n<header><nav aria-label=\"Main\"><a href=\"/\">Home</a> <a href=\"/products\">Products</a> <a href=\"/pricing\">Pricing</a> <a href=\"/support\">Support</a> <a href=\"/contact\">Contact</a></nav></header>\n<main id=\"main\">\n<h1>Contact us</h1>\n<form><label for=\"name\">Name</label><input id=\"name\" name=\"name\" autocomplete=\"name\"><label for=\"msg\">Message</label><textarea id=\"msg\" name=\"msg\"></textarea><button type=\"submit\">Send</button></form>\n<img src=\"/team.jpg\" alt=\"Our support team in the Berlin office\">\n</main>\n</body>\n</html>",
                    "maxFindings": 50
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/A11ySnapshotResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/website-change-explainer/calculate": {
      "post": {
        "operationId": "calculateWebsiteChangeExplainer",
        "summary": "Compare two versions of a page and see which changes matter: prices, terms, dates, links.",
        "description": "Give a \"before\" and an \"after\" version of a web page (fetch a URL now or paste saved HTML/text). The tool extracts readable blocks, title, meta description, headings, links, prices and dates, diffs them block by block and word by word, and ranks meaningful changes above noise like whitespace, tracking parameters, timestamps or copyright years.\n\nMethodology:\n- Each side is parsed (tolerant HTML tree builder; plain text is split into lines). Text is collected per block-level element (p, li, h1–h6, td, …); scripts, styles and navigation-less noise like <svg> are skipped.\n- Blocks are aligned with a longest-common-subsequence diff over whitespace-normalised text; adjacent removed/added blocks with ≥ 40 % word overlap (Dice) are paired as \"modified\" and diffed word by word.\n- A change is trivial when it disappears after masking whitespace/case, clock times, \"N minutes ago\", copyright years and long hex/random tokens; links differing only in tracking parameters (utm_*, gclid, fbclid, …) are trivial.\n- Meaningful categories and scores: price 100, legal/terms keyword 90, contact (email/phone) 75, link target 70, title 65, date 60, heading 55, other number 45, meta description 40, link removed/added 35/30, other text 20 (+ up to 15 for size). Changes are ranked by score, then document order.\n- Every change lists the rule ids and matched tokens that produced its category.\n\nRule-based comparison of static HTML. Pages that build content with JavaScript may show fewer blocks than a browser; always read the actual wording of legal changes.",
        "tags": [
          "internet"
        ],
        "x-mcp-tool": "website_change_explainer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebsiteChangeExplainerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Pricing page: price rise, new auto-renewal clause, tracking link",
                  "value": {
                    "beforeContent": "<html><head><title>Pricing – Acme Cloud</title><meta name=\"description\" content=\"Simple pricing for teams.\"></head><body>\n<h1>Pricing</h1><h2>Pro plan</h2><p>Pro costs $12 per month per user.</p><p>Cancel anytime from your dashboard.</p>\n<p>Questions? Email sales@acme.example or call +1 555 010 2000.</p>\n<a href=\"https://acme.example/terms?utm_source=footer\">Terms</a> <a href=\"https://acme.example/signup\">Start trial</a>\n<footer><p>© 2025 Acme Inc. Page generated at 10:15</p></footer></body></html>",
                    "afterContent": "<html><head><title>Pricing – Acme Cloud</title><meta name=\"description\" content=\"Simple pricing for teams.\"></head><body>\n<h1>Pricing</h1><h2>Pro plan</h2><p>Pro costs $15 per month per user.</p><p>Plans renew automatically each year; cancellation requires 30 days notice.</p>\n<p>Questions? Email sales@acme.example or call +1 555 010 2000.</p>\n<a href=\"https://acme.example/terms?utm_source=header\">Terms</a> <a href=\"https://acme.example/signup-2026\">Start trial</a>\n<h2>Enterprise</h2><p>Contact us for volume pricing.</p>\n<footer><p>© 2026 Acme Inc. Page generated at 09:02</p></footer></body></html>",
                    "includeTrivial": true,
                    "maxChanges": 50
                  }
                },
                "example2": {
                  "summary": "Plain-text policy: changed deadline",
                  "value": {
                    "beforeContent": "Returns policy\nYou can return items within 30 days of delivery.\nRefunds are issued within 14 days.\nLast reviewed: 2026-01-10",
                    "afterContent": "Returns policy\nYou can return items within 14 days of delivery.\nRefunds are issued within 14 days.\nLast reviewed: 2026-09-01",
                    "includeTrivial": false,
                    "maxChanges": 20
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebsiteChangeExplainerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/scam-signal-checker/calculate": {
      "post": {
        "operationId": "calculateScamSignalChecker",
        "summary": "Check a message or link for common scam and phishing warning signs — without clicking.",
        "description": "Paste a suspicious e-mail, SMS or chat message and/or links (English or German). The checker looks for documented warning signs — urgency, threats, gift-card or crypto payment, requests for passwords or codes, lookalike and punycode domains, brand/domain mismatches, URL shorteners, risky attachments — and gives a weighted, explained score. Links are analysed statically and never opened. It never declares a message safe.\n\nMethodology:\n- Nothing is fetched or clicked: links are parsed as text (WHATWG URL parser) and compared with rules.\n- Each signal has a fixed weight; the score is the sum of the weights of the distinct signals found, capped at 100. Weights: urgency 15, threat 20, gift-card 30, crypto 25, wire 20, advance-fee 15, credentials 30, remote-access 25, prize 20, parcel-lure 10, generic-greeting 5, family-new-number 25, secrecy 10, investment 15, brand-domain-mismatch 30, lookalike-domain 35, punycode 25, shortener 10, ip-literal 25, at-in-url 25, display-mismatch 30, suspicious-tld 10, many-subdomains 10, no-https 10, sender-brand-mismatch 25, risky-attachment 30, double-extension 10.\n- Verdict: ≥ 50 \"high-risk signals\", 20–49 \"some warning signs\", 1–19 \"minor signals only\", 0 \"no common warning signs found\". No level means \"safe\" — scams without these patterns exist.\n- Brand checks use an editorial list of 67 frequently impersonated brands and their main official domains: lookalikes are detected by homoglyph normalisation (0→o, 1→l, rn→m, Cyrillic letters …) and edit distance (1 for names ≥ 5 letters, 2 for ≥ 9); brand names inside other domains or paths count as brand/domain mismatch.\n- The suspicious-TLD list is a heuristic (.zip .mov .top .xyz .click .link .work .support .rest .fit .cfd .sbs .icu .buzz .cam .gq .ml .cf .ga .tk .monster .quest .lol .cyou .bond .shop .online .site .live .info .ru .su); plenty of legitimate sites use these endings, so the weight is low.\n- Language rules cover English and German phrasing (e.g. \"Ihr Konto wurde gesperrt\", \"Zollgebühr\", \"Paket\", \"Hallo Mama, das ist meine neue Nummer\"). Each signal quotes the sentence, URL or file name that triggered it.\n\nA low score never means a message is safe. This is a static pattern check, not a malware scan or a verdict on the sender. When in doubt, contact the company through its official app, website or phone number — never via links or numbers in the message.",
        "tags": [
          "internet"
        ],
        "x-mcp-tool": "scam_signal_checker",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScamSignalCheckerInput"
              },
              "examples": {
                "example1": {
                  "summary": "German bank phishing e-mail",
                  "value": {
                    "message": "Sehr geehrter Kunde,\nIhr Konto wurde vorübergehend gesperrt. Bitte bestätigen Sie Ihre Zugangsdaten innerhalb von 24 Stunden, sonst wird Ihr Online-Banking dauerhaft deaktiviert.\nJetzt entsperren: http://sparkasse-sicherheit.konto-verifizierung.top/login\nIhre Sparkasse",
                    "senderAddress": "service@sparkasse-kundenservice.info"
                  }
                },
                "example2": {
                  "summary": "Parcel SMS with lookalike link",
                  "value": {
                    "message": "DHL: Your parcel could not be delivered. A redelivery fee of 1.99 EUR is due. Pay now: https://dhI-redelivery.com/track?id=8812",
                    "urls": [
                      "https://xn--pypal-4ve.com/signin",
                      "bit.ly/3xYzAbc"
                    ],
                    "attachments": [
                      "Sendungsdetails.pdf.exe"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScamSignalCheckerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/browser-compatibility-checker/calculate": {
      "post": {
        "operationId": "calculateBrowserCompatibilityChecker",
        "summary": "Which browsers support a CSS property, JS API or HTML element? MDN data + Baseline status.",
        "description": "Look up a web platform feature by its MDN browser-compat-data key (css.properties.container, api.Navigator.share) or by free text (container queries, dialog, structuredClone) and get the first supporting version per browser, flags/prefix/partial notes, the current browser versions and the Baseline status from web-features.\n\nMethodology:\n- Data: the published @mdn/browser-compat-data package (data.json from unpkg), pruned to one record per feature and cached for 7 days. Baseline status comes from the web-features package (status.by_compat_key). If the download fails, a bundled subset of the same data is used and the result says so.\n- An exact BCD key is looked up directly; otherwise every word must appear in the key, the description or the Baseline feature name. Shallower keys and whole-segment matches rank first.\n- Each cell is BCD's first (main) support statement: the version that added the feature, \"No\", or notes for partial support, prefixes, alternative names, flags and removal. Other statements (e.g. older prefixed versions) are summarised in BCD itself, linked via MDN.\n- Baseline: \"widely available\" = supported in Chrome, Edge, Firefox and Safari (desktop and mobile) for 30 months; \"newly available\" = supported in all of them; otherwise \"limited availability\".",
        "tags": [
          "developer"
        ],
        "x-mcp-tool": "browser_compatibility_checker",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BrowserCompatibilityCheckerInput"
              },
              "examples": {
                "example1": {
                  "summary": "CSS container property",
                  "value": {
                    "query": "css.properties.container",
                    "source": "bundled"
                  }
                },
                "example2": {
                  "summary": "Web Share API (navigator.share)",
                  "value": {
                    "query": "api.Navigator.share",
                    "source": "bundled"
                  }
                },
                "example3": {
                  "summary": "Search \"dialog\"",
                  "value": {
                    "query": "dialog",
                    "source": "bundled",
                    "maxResults": 8
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrowserCompatibilityCheckerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/network-speed-tester/calculate": {
      "post": {
        "operationId": "calculateNetworkSpeedTester",
        "summary": "Measure latency, jitter, download and upload speed between your browser and our server.",
        "description": "Runs in your browser: a series of small requests measures latency and jitter, then a random, incompressible download and an upload measure throughput to this server. Without JavaScript you can enter your own measurements (bytes and milliseconds) and get the same statistics.\n\nMethodology:\n- Latency: the browser sends about 20 tiny no-store requests to /speedtest/ping one after another and times each round trip (the first, which may include connection setup, is discarded). Jitter is the mean absolute difference between consecutive samples.\n- Download: random bytes from /speedtest/download in growing sizes (up to 50 MB) until one transfer takes about 2 seconds; speed = bytes × 8 ÷ time, in megabits per second (10^6 bit/s). The payload is random, so compression cannot inflate the result.\n- Upload: random bytes generated in the browser are POSTed to /speedtest/upload, which discards them and reports how many arrived.\n- Everything runs between your browser and this one server in one region; results to other servers, CDNs or regions can differ a lot. Wi-Fi, VPNs, browser extensions and other traffic on your connection all affect the numbers.\n\nMeasures only the path between your device and our server (single region). Not an official broadband measurement.",
        "tags": [
          "developer"
        ],
        "x-mcp-tool": "network_speed_tester",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NetworkSpeedTesterInput"
              },
              "examples": {
                "example1": {
                  "summary": "Example measurements (fibre-like)",
                  "value": {
                    "pingSamples": "18.2, 17.9, 19.4, 18.1, 25.6, 18.0, 18.3, 17.8, 19.0, 18.4",
                    "downloadBytes": 50000000,
                    "downloadMs": 1420,
                    "uploadBytes": 20000000,
                    "uploadMs": 3350
                  }
                },
                "example2": {
                  "summary": "No measurements yet (explains the test)",
                  "value": {}
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NetworkSpeedTesterResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/explore/calculate": {
      "post": {
        "operationId": "calculateExplore",
        "summary": "Search transactions, contracts, domains, packages, advisories, MCP servers and websites in one box.",
        "description": "Paste anything technical — a transaction hash, a contract address, a domain, a package like npm:lodash@4.17.20, an advisory ID (GHSA/CVE), an MCP server URL or a web page. The explorer recognises what it is, runs the matching specialised explorer, and gives the entity a permanent page for people and a matching JSON endpoint for software and AI agents. Every answer carries its sources, retrieval time and schema version.\n\nMethodology:\n- Detection rules, in order: 32-byte hex → transaction; 20-byte hex → contract/address; GHSA/CVE/PYSEC/GO/RUSTSEC id → advisory; ecosystem:name@version → package; URL ending in /mcp or /sse (or host mcp.*) → MCP server; other URL → website AI readiness; bare domain → DNS + certificate.\n- The matching explorer runs with its own methodology; its sources, assumptions and warnings are passed through unchanged.\n- Permanent URLs: /explore/{kind}/… for people and /api/v1/… for machines are computed by the same explorer and return the identical result.",
        "tags": [
          "explorer"
        ],
        "x-mcp-tool": "explore",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExploreInput"
              },
              "examples": {
                "example1": {
                  "summary": "A domain",
                  "value": {
                    "query": "example.com"
                  }
                },
                "example2": {
                  "summary": "A package version",
                  "value": {
                    "query": "npm:lodash@4.17.20"
                  }
                },
                "example3": {
                  "summary": "USDC contract on Ethereum",
                  "value": {
                    "query": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
                    "chain": "ethereum"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExploreResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/workflows": {
      "get": {
        "operationId": "listWorkflows",
        "summary": "Multi-tool workflows",
        "responses": {
          "200": {
            "description": "Workflow list.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details. 422 responses include per-field `errors`.",
        "required": [
          "type",
          "title",
          "status",
          "detail"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          },
          "detail": {
            "type": "string"
          },
          "code": {
            "type": "string"
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "field",
                "message"
              ],
              "properties": {
                "field": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "HeaderlensInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "target": {
            "title": "Website address",
            "description": "Domain or URL. Only the hostname is checked and stored.",
            "type": "string",
            "maxLength": 2048
          }
        },
        "required": [
          "target"
        ]
      },
      "HeaderlensResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "hostname",
              "checkId",
              "observedAt",
              "classification",
              "consensusReason",
              "regions",
              "reportUrl",
              "fromCache"
            ],
            "properties": {
              "hostname": {
                "type": "string"
              },
              "checkId": {
                "type": "string"
              },
              "observedAt": {
                "type": "string",
                "format": "date-time"
              },
              "classification": {
                "type": "string",
                "enum": [
                  "up",
                  "reachable_restricted",
                  "degraded",
                  "down",
                  "inconclusive"
                ]
              },
              "consensusReason": {
                "type": "string",
                "enum": [
                  "single_region",
                  "unanimous",
                  "majority",
                  "partial_outage",
                  "no_conclusive_data"
                ]
              },
              "unavailableRegions": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "fromCache": {
                "type": "boolean"
              },
              "reportUrl": {
                "type": "string",
                "format": "uri"
              },
              "headers": {
                "description": "Security & caching header assessment of the primary region (the same rows as the presentation table).",
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "header",
                    "present",
                    "severity",
                    "summary"
                  ],
                  "properties": {
                    "header": {
                      "type": "string"
                    },
                    "present": {
                      "type": "boolean"
                    },
                    "severity": {
                      "type": "string",
                      "enum": [
                        "good",
                        "info",
                        "warning"
                      ]
                    },
                    "summary": {
                      "type": "string"
                    }
                  }
                }
              },
              "regions": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "region",
                    "classification",
                    "reason",
                    "httpStatus",
                    "durationMs",
                    "tlsValid"
                  ],
                  "properties": {
                    "region": {
                      "type": "string"
                    },
                    "classification": {
                      "type": "string",
                      "enum": [
                        "up",
                        "reachable_restricted",
                        "degraded",
                        "down",
                        "inconclusive"
                      ]
                    },
                    "reason": {
                      "type": "string",
                      "enum": [
                        "http_success",
                        "http_only",
                        "slow_response",
                        "tls_invalid",
                        "too_many_redirects",
                        "redirect_blocked",
                        "http_client_error",
                        "http_server_error",
                        "authentication_required",
                        "forbidden",
                        "rate_limited",
                        "bot_challenge",
                        "dns_nxdomain",
                        "dns_error",
                        "connection_refused",
                        "connection_timeout",
                        "connection_failed"
                      ]
                    },
                    "httpStatus": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "durationMs": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "tlsValid": {
                      "type": [
                        "boolean",
                        "null"
                      ]
                    }
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "DnsCertificateExplorerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "domain": {
            "title": "Domain",
            "type": "string",
            "maxLength": 253
          },
          "certificateTransparency": {
            "title": "Include Certificate Transparency history (crt.sh, slower)",
            "type": "boolean",
            "default": true
          }
        },
        "required": [
          "domain"
        ]
      },
      "DnsCertificateExplorerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "domain",
              "records",
              "email",
              "caaIssuers",
              "certificate",
              "ctLog",
              "findings"
            ],
            "properties": {
              "domain": {
                "type": "string"
              },
              "records": {
                "type": "object",
                "additionalProperties": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "email": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "spf",
                  "spfLookups",
                  "dmarc",
                  "dmarcPolicy",
                  "mtaSts"
                ],
                "properties": {
                  "spf": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "spfLookups": {
                    "type": "integer"
                  },
                  "dmarc": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "dmarcPolicy": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "mtaSts": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              },
              "caaIssuers": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "certificate": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "subject",
                  "issuer",
                  "validFrom",
                  "validTo",
                  "daysLeft",
                  "san",
                  "keyType",
                  "keyBits",
                  "serialNumber",
                  "fingerprint256",
                  "chainLength",
                  "hostnameMatches",
                  "authorized",
                  "authorizationError",
                  "protocol",
                  "servedFrom"
                ],
                "properties": {
                  "subject": {
                    "type": "string"
                  },
                  "issuer": {
                    "type": "string"
                  },
                  "validFrom": {
                    "type": "string"
                  },
                  "validTo": {
                    "type": "string"
                  },
                  "daysLeft": {
                    "type": "integer"
                  },
                  "san": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "keyType": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "keyBits": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "serialNumber": {
                    "type": "string"
                  },
                  "fingerprint256": {
                    "type": "string"
                  },
                  "chainLength": {
                    "type": "integer"
                  },
                  "hostnameMatches": {
                    "type": "boolean"
                  },
                  "authorized": {
                    "type": "boolean"
                  },
                  "authorizationError": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "protocol": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "servedFrom": {
                    "type": "string"
                  }
                }
              },
              "ctLog": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "id",
                    "issuer",
                    "names",
                    "notBefore",
                    "notAfter"
                  ],
                  "properties": {
                    "id": {
                      "type": "integer"
                    },
                    "issuer": {
                      "type": "string"
                    },
                    "names": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "notBefore": {
                      "type": "string"
                    },
                    "notAfter": {
                      "type": "string"
                    }
                  }
                }
              },
              "findings": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "severity",
                    "area",
                    "finding"
                  ],
                  "properties": {
                    "severity": {
                      "type": "string",
                      "enum": [
                        "high",
                        "medium",
                        "low",
                        "info"
                      ]
                    },
                    "area": {
                      "type": "string"
                    },
                    "finding": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "EmailInfrastructureExplorerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "enum": [
              "live",
              "paste"
            ],
            "default": "live"
          },
          "domain": {
            "title": "Domain",
            "type": "string",
            "maxLength": 253
          },
          "records": {
            "title": "DNS records (paste mode)",
            "description": "Zone-file lines: name [ttl] [IN] TYPE value. Use @ for the domain, relative names like _dmarc or selector1._domainkey, and a trailing dot for other domains (e.g. include targets).",
            "type": "string",
            "maxLength": 60000
          },
          "mtaStsPolicy": {
            "title": "MTA-STS policy file (paste mode, optional)",
            "type": "string",
            "maxLength": 10000
          }
        },
        "required": [
          "domain"
        ]
      },
      "EmailInfrastructureExplorerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "domain",
              "mode",
              "score",
              "grade",
              "scoreItems",
              "mx",
              "nullMx",
              "spf",
              "dmarc",
              "dkim",
              "mtaSts",
              "tlsRpt",
              "bimi",
              "findings",
              "fixes"
            ],
            "properties": {
              "domain": {
                "type": "string"
              },
              "mode": {
                "type": "string",
                "enum": [
                  "live",
                  "paste"
                ]
              },
              "score": {
                "type": "integer"
              },
              "grade": {
                "type": "string"
              },
              "scoreItems": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "area",
                    "points",
                    "max",
                    "applicable",
                    "detail"
                  ],
                  "properties": {
                    "area": {
                      "type": "string"
                    },
                    "points": {
                      "type": "number"
                    },
                    "max": {
                      "type": "number"
                    },
                    "applicable": {
                      "type": "boolean"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              },
              "mx": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "priority",
                    "exchange",
                    "addresses"
                  ],
                  "properties": {
                    "priority": {
                      "type": "integer"
                    },
                    "exchange": {
                      "type": "string"
                    },
                    "addresses": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              },
              "nullMx": {
                "type": "boolean"
              },
              "spf": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "record",
                  "lookups",
                  "voidLookups",
                  "includes"
                ],
                "properties": {
                  "record": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "lookups": {
                    "type": "integer"
                  },
                  "voidLookups": {
                    "type": "integer"
                  },
                  "includes": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "domain",
                        "depth",
                        "record",
                        "lookups"
                      ],
                      "properties": {
                        "domain": {
                          "type": "string"
                        },
                        "depth": {
                          "type": "integer"
                        },
                        "record": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "lookups": {
                          "type": "integer"
                        }
                      }
                    }
                  }
                }
              },
              "dmarc": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "record",
                  "policy"
                ],
                "properties": {
                  "record": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "policy": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              },
              "dkim": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "selector",
                    "record",
                    "keyType",
                    "bits",
                    "revoked"
                  ],
                  "properties": {
                    "selector": {
                      "type": "string"
                    },
                    "record": {
                      "type": "string"
                    },
                    "keyType": {
                      "type": "string"
                    },
                    "bits": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "revoked": {
                      "type": "boolean"
                    }
                  }
                }
              },
              "mtaSts": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "record",
                  "policyFetched",
                  "mode",
                  "mx",
                  "maxAge"
                ],
                "properties": {
                  "record": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "policyFetched": {
                    "type": "boolean"
                  },
                  "mode": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "mx": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "maxAge": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  }
                }
              },
              "tlsRpt": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "bimi": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "findings": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "severity",
                    "area",
                    "finding"
                  ],
                  "properties": {
                    "severity": {
                      "type": "string",
                      "enum": [
                        "high",
                        "medium",
                        "low",
                        "info"
                      ]
                    },
                    "area": {
                      "type": "string"
                    },
                    "finding": {
                      "type": "string"
                    }
                  }
                }
              },
              "fixes": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "SecurityConfigurationScannerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "domain": {
            "title": "Domain",
            "type": "string",
            "maxLength": 253
          },
          "mode": {
            "title": "Mode",
            "type": "string",
            "enum": [
              "live",
              "pasted"
            ],
            "default": "live"
          },
          "authorized": {
            "title": "I own this domain or am authorised to test it",
            "description": "Required for live scans.",
            "type": "boolean",
            "default": false
          },
          "headers": {
            "title": "Pasted: HTTP response headers",
            "type": "string",
            "maxLength": 50000
          },
          "dnsRecords": {
            "title": "Pasted: DNS records",
            "type": "string",
            "maxLength": 20000
          },
          "certificate": {
            "title": "Pasted: certificate summary",
            "type": "string",
            "maxLength": 5000
          },
          "securityTxt": {
            "title": "Pasted: security.txt content",
            "type": "string",
            "maxLength": 20000
          },
          "httpsRedirect": {
            "title": "Pasted: does http:// redirect to https://?",
            "type": "string",
            "enum": [
              "unknown",
              "yes",
              "no"
            ],
            "default": "unknown"
          }
        },
        "required": [
          "domain"
        ]
      },
      "SecurityConfigurationScannerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "domain",
              "mode",
              "grade",
              "score",
              "counts",
              "findings",
              "certificate",
              "dnssec",
              "httpsRedirect",
              "securityTxt",
              "cookies",
              "notice"
            ],
            "properties": {
              "domain": {
                "type": "string"
              },
              "mode": {
                "type": "string",
                "enum": [
                  "live",
                  "pasted"
                ]
              },
              "grade": {
                "type": "string",
                "enum": [
                  "A",
                  "B",
                  "C",
                  "D",
                  "F"
                ]
              },
              "score": {
                "type": "integer"
              },
              "counts": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "high",
                  "medium",
                  "low",
                  "info"
                ],
                "properties": {
                  "high": {
                    "type": "integer"
                  },
                  "medium": {
                    "type": "integer"
                  },
                  "low": {
                    "type": "integer"
                  },
                  "info": {
                    "type": "integer"
                  }
                }
              },
              "findings": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "severity",
                    "area",
                    "finding",
                    "fix"
                  ],
                  "properties": {
                    "severity": {
                      "type": "string",
                      "enum": [
                        "high",
                        "medium",
                        "low",
                        "info"
                      ]
                    },
                    "area": {
                      "type": "string"
                    },
                    "finding": {
                      "type": "string"
                    },
                    "fix": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                }
              },
              "certificate": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "issuer",
                  "validTo",
                  "daysLeft",
                  "protocol",
                  "trusted"
                ],
                "properties": {
                  "issuer": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "validTo": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "daysLeft": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "protocol": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "trusted": {
                    "type": [
                      "boolean",
                      "null"
                    ]
                  }
                }
              },
              "dnssec": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "httpsRedirect": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "securityTxt": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "present",
                  "contact",
                  "expires",
                  "expired",
                  "signed",
                  "fields"
                ],
                "properties": {
                  "present": {
                    "type": "boolean"
                  },
                  "contact": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "expires": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "expired": {
                    "type": [
                      "boolean",
                      "null"
                    ]
                  },
                  "signed": {
                    "type": "boolean"
                  },
                  "fields": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                }
              },
              "cookies": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "name",
                    "secure",
                    "httpOnly",
                    "sameSite"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "secure": {
                      "type": "boolean"
                    },
                    "httpOnly": {
                      "type": "boolean"
                    },
                    "sameSite": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                }
              },
              "notice": {
                "type": "string"
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "HttpTechnologyExplorerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "enum": [
              "live",
              "paste"
            ],
            "default": "live"
          },
          "url": {
            "title": "URL (live mode)",
            "type": "string",
            "format": "uri"
          },
          "rawHeaders": {
            "title": "Raw response headers (paste mode)",
            "description": "Output of curl -sIL or the browser's raw response headers. Several blocks are read as a redirect chain.",
            "type": "string",
            "maxLength": 60000
          },
          "html": {
            "title": "HTML source (paste mode, optional)",
            "type": "string",
            "maxLength": 400000
          }
        },
        "required": []
      },
      "HttpTechnologyExplorerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "mode",
              "requestedUrl",
              "finalUrl",
              "status",
              "redirects",
              "httpsUpgrade",
              "protocols",
              "compression",
              "caching",
              "security",
              "technologies",
              "headers"
            ],
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "live",
                  "paste"
                ]
              },
              "requestedUrl": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "finalUrl": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "status": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "redirects": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "status",
                    "location"
                  ],
                  "properties": {
                    "status": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "location": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                }
              },
              "httpsUpgrade": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "protocols": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "observed",
                  "http2Advertised",
                  "http3Advertised",
                  "altSvc"
                ],
                "properties": {
                  "observed": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "http2Advertised": {
                    "type": "boolean"
                  },
                  "http3Advertised": {
                    "type": "boolean"
                  },
                  "altSvc": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              },
              "compression": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "encoding",
                  "compressed",
                  "contentType"
                ],
                "properties": {
                  "encoding": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "compressed": {
                    "type": "boolean"
                  },
                  "contentType": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              },
              "caching": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "verdict",
                  "cacheControl",
                  "maxAge",
                  "sMaxAge",
                  "sharedTtl",
                  "etag",
                  "lastModified",
                  "age",
                  "vary",
                  "expires"
                ],
                "properties": {
                  "verdict": {
                    "type": "string"
                  },
                  "cacheControl": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "maxAge": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "sMaxAge": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "sharedTtl": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "etag": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "lastModified": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "age": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "vary": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "expires": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              },
              "security": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "id",
                    "header",
                    "present",
                    "value",
                    "severity",
                    "summary"
                  ],
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "header": {
                      "type": "string"
                    },
                    "present": {
                      "type": "boolean"
                    },
                    "value": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "severity": {
                      "type": "string",
                      "enum": [
                        "good",
                        "info",
                        "warning"
                      ]
                    },
                    "summary": {
                      "type": "string"
                    }
                  }
                }
              },
              "technologies": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "name",
                    "category",
                    "confidence",
                    "evidence",
                    "version"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "category": {
                      "type": "string"
                    },
                    "confidence": {
                      "type": "string",
                      "enum": [
                        "high",
                        "medium",
                        "low"
                      ]
                    },
                    "evidence": {
                      "type": "string"
                    },
                    "version": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                }
              },
              "headers": {
                "type": "object",
                "additionalProperties": {
                  "type": "string"
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "CdnBehaviorExplorerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "enum": [
              "live",
              "paste"
            ],
            "default": "live"
          },
          "url": {
            "title": "URL (live mode)",
            "type": "string",
            "format": "uri"
          },
          "headersFirst": {
            "title": "Response headers of request 1 (paste mode)",
            "type": "string",
            "maxLength": 30000
          },
          "headersSecond": {
            "title": "Response headers of request 2 (paste mode)",
            "type": "string",
            "maxLength": 30000
          }
        },
        "required": []
      },
      "CdnBehaviorExplorerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "mode",
              "url",
              "cdns",
              "requests",
              "verdict",
              "explanation",
              "ageDelta",
              "dateDelta",
              "etagStable",
              "caching",
              "regionComparison"
            ],
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "live",
                  "paste"
                ]
              },
              "url": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "cdns": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "cdn",
                    "confidence",
                    "evidence"
                  ],
                  "properties": {
                    "cdn": {
                      "type": "string"
                    },
                    "confidence": {
                      "type": "string",
                      "enum": [
                        "high",
                        "medium",
                        "low"
                      ]
                    },
                    "evidence": {
                      "type": "string"
                    }
                  }
                }
              },
              "requests": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "status",
                    "cacheStatus",
                    "cacheHeader",
                    "age",
                    "date",
                    "etag",
                    "pop",
                    "encoding"
                  ],
                  "properties": {
                    "status": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "cacheStatus": {
                      "type": "string"
                    },
                    "cacheHeader": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "age": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "date": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "etag": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "pop": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "encoding": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                }
              },
              "verdict": {
                "type": "string",
                "enum": [
                  "edge-cached",
                  "warmed-on-second-request",
                  "not-cached-at-edge",
                  "bypassed",
                  "no-cdn-detected",
                  "inconclusive"
                ]
              },
              "explanation": {
                "type": "string"
              },
              "ageDelta": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "dateDelta": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "etagStable": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "caching": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "verdict",
                  "cacheControl",
                  "cdnCacheControl",
                  "surrogateControl",
                  "sharedTtl",
                  "browserTtl",
                  "vary"
                ],
                "properties": {
                  "verdict": {
                    "type": "string"
                  },
                  "cacheControl": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "cdnCacheControl": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "surrogateControl": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "sharedTtl": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "browserTtl": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "vary": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              },
              "regionComparison": {
                "type": "string"
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "Ipv6ReadinessExplorerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "enum": [
              "live",
              "pasted"
            ],
            "default": "live"
          },
          "domain": {
            "title": "Domain",
            "type": "string",
            "maxLength": 253
          },
          "connectTest": {
            "title": "Also try a TCP connection to port 443 over IPv6 from this server",
            "type": "boolean",
            "default": true
          },
          "pasted": {
            "title": "Record set (JSON)",
            "description": "Pasted mode: {domain, hosts:[{name, ipv4, ipv6}], nameservers:[…], mx:[{name, priority, ipv4, ipv6}], connect?:[{host, address, ok, code}]}",
            "type": "string",
            "maxLength": 100000
          }
        },
        "required": []
      },
      "Ipv6ReadinessExplorerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "domain",
              "score",
              "grade",
              "points",
              "maxPoints",
              "checks",
              "hosts",
              "nameservers",
              "mx",
              "addresses",
              "connect",
              "serverHasNoIpv6"
            ],
            "properties": {
              "domain": {
                "type": "string"
              },
              "score": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100
              },
              "grade": {
                "type": "string",
                "enum": [
                  "A",
                  "B",
                  "C",
                  "D",
                  "F"
                ]
              },
              "points": {
                "type": "integer"
              },
              "maxPoints": {
                "type": "integer"
              },
              "checks": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "id",
                    "label",
                    "status",
                    "points",
                    "max",
                    "detail"
                  ],
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "label": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "pass",
                        "fail",
                        "partial",
                        "n/a"
                      ]
                    },
                    "points": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              },
              "hosts": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "name",
                    "ipv4",
                    "ipv6"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "ipv4": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "ipv6": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              },
              "nameservers": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "name",
                    "ipv4",
                    "ipv6"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "ipv4": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "ipv6": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              },
              "mx": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "name",
                    "ipv4",
                    "ipv6",
                    "priority"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "ipv4": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "ipv6": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "priority": {
                      "type": "integer"
                    }
                  }
                }
              },
              "addresses": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "host",
                    "role",
                    "address",
                    "global",
                    "kind"
                  ],
                  "properties": {
                    "host": {
                      "type": "string"
                    },
                    "role": {
                      "type": "string"
                    },
                    "address": {
                      "type": "string"
                    },
                    "global": {
                      "type": "boolean"
                    },
                    "kind": {
                      "type": "string"
                    }
                  }
                }
              },
              "connect": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "host",
                    "address",
                    "ok",
                    "code",
                    "ms"
                  ],
                  "properties": {
                    "host": {
                      "type": "string"
                    },
                    "address": {
                      "type": "string"
                    },
                    "ok": {
                      "type": "boolean"
                    },
                    "code": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "ms": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    }
                  }
                }
              },
              "serverHasNoIpv6": {
                "type": "boolean"
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "GlobalDnsExplorerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "enum": [
              "live",
              "pasted"
            ],
            "default": "live"
          },
          "domain": {
            "title": "Domain",
            "description": "Live mode: the domain or host name to check.",
            "type": "string",
            "maxLength": 253
          },
          "pasted": {
            "title": "Resolver answers (JSON)",
            "description": "Pasted mode: {domain, zone?, dsPresent?, nameservers:[{name,addresses}], resolvers:[{id,label,kind:\"authoritative\"|\"public-doh\"|\"local\",status,ad?,records:{A:{values,ttl}}}]} — the \"result\" of a live check also works.",
            "type": "string",
            "maxLength": 200000
          },
          "trackChanges": {
            "title": "Remember this check and show changes since the last one",
            "type": "boolean",
            "default": true
          }
        },
        "required": []
      },
      "GlobalDnsExplorerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "domain",
              "zone",
              "mode",
              "nameservers",
              "resolvers",
              "records",
              "soaSerials",
              "propagationInProgress",
              "dnssec",
              "comparison",
              "ttl",
              "findings",
              "history"
            ],
            "properties": {
              "domain": {
                "type": "string"
              },
              "zone": {
                "type": "string"
              },
              "mode": {
                "type": "string",
                "enum": [
                  "live",
                  "pasted"
                ]
              },
              "nameservers": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "name",
                    "addresses",
                    "inBailiwick"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "addresses": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "inBailiwick": {
                      "type": "boolean"
                    }
                  }
                }
              },
              "resolvers": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "id",
                    "label",
                    "kind",
                    "address",
                    "status",
                    "error",
                    "ad",
                    "records"
                  ],
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "label": {
                      "type": "string"
                    },
                    "kind": {
                      "type": "string",
                      "enum": [
                        "authoritative",
                        "public-doh",
                        "local"
                      ]
                    },
                    "address": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "status": {
                      "type": "string"
                    },
                    "error": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "ad": {
                      "type": [
                        "boolean",
                        "null"
                      ]
                    },
                    "records": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "values",
                          "ttl"
                        ],
                        "properties": {
                          "values": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          },
                          "ttl": {
                            "type": [
                              "integer",
                              "null"
                            ]
                          }
                        }
                      }
                    }
                  }
                }
              },
              "records": {
                "type": "object",
                "additionalProperties": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "soaSerials": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "resolver",
                    "serial"
                  ],
                  "properties": {
                    "resolver": {
                      "type": "string"
                    },
                    "serial": {
                      "type": "integer"
                    }
                  }
                }
              },
              "propagationInProgress": {
                "type": "boolean"
              },
              "dnssec": {
                "type": "string",
                "enum": [
                  "validated",
                  "unsigned",
                  "bogus",
                  "signed-not-validated",
                  "unknown"
                ]
              },
              "comparison": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "type",
                    "resolversAnswering",
                    "variants",
                    "authoritativeConsistent",
                    "differing"
                  ],
                  "properties": {
                    "type": {
                      "type": "string"
                    },
                    "resolversAnswering": {
                      "type": "integer"
                    },
                    "variants": {
                      "type": "integer"
                    },
                    "authoritativeConsistent": {
                      "type": "boolean"
                    },
                    "differing": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              },
              "ttl": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "type",
                    "authoritative",
                    "google",
                    "cloudflare",
                    "local"
                  ],
                  "properties": {
                    "type": {
                      "type": "string"
                    },
                    "authoritative": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "google": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "cloudflare": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "local": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    }
                  }
                }
              },
              "findings": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "severity",
                    "area",
                    "finding"
                  ],
                  "properties": {
                    "severity": {
                      "type": "string",
                      "enum": [
                        "high",
                        "medium",
                        "low",
                        "info"
                      ]
                    },
                    "area": {
                      "type": "string"
                    },
                    "finding": {
                      "type": "string"
                    }
                  }
                }
              },
              "history": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "tracked",
                  "previousCheck",
                  "changes",
                  "events"
                ],
                "properties": {
                  "tracked": {
                    "type": "boolean"
                  },
                  "previousCheck": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "changes": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "type",
                        "added",
                        "removed"
                      ],
                      "properties": {
                        "type": {
                          "type": "string"
                        },
                        "added": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "removed": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  },
                  "events": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "checkedAt",
                        "changes"
                      ],
                      "properties": {
                        "checkedAt": {
                          "type": "string"
                        },
                        "changes": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "additionalProperties": false,
                            "required": [
                              "type",
                              "added",
                              "removed"
                            ],
                            "properties": {
                              "type": {
                                "type": "string"
                              },
                              "added": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "removed": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "CertificateTransparencyExplorerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "enum": [
              "live",
              "pasted"
            ],
            "default": "live"
          },
          "domain": {
            "title": "Domain",
            "description": "Also used in pasted mode to tell subdomains from other domains.",
            "type": "string",
            "maxLength": 253
          },
          "includeSubdomains": {
            "title": "Include subdomains (%.domain, slower)",
            "type": "boolean",
            "default": true
          },
          "expiringWithinDays": {
            "title": "Warn when a name expires within",
            "type": "integer",
            "minimum": 1,
            "maximum": 365,
            "default": 30,
            "x-unit": "days"
          },
          "pasted": {
            "title": "crt.sh JSON",
            "description": "Pasted mode: the JSON array from https://crt.sh/?q=example.com&output=json",
            "type": "string",
            "maxLength": 200000
          }
        },
        "required": []
      },
      "CertificateTransparencyExplorerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "domain",
              "counts",
              "certificates",
              "names",
              "subdomains",
              "wildcards",
              "relatedDomains",
              "issuers",
              "issuersOverTime",
              "findings"
            ],
            "properties": {
              "domain": {
                "type": "string"
              },
              "counts": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "certificates",
                  "valid",
                  "expiring",
                  "expired",
                  "wildcardCertificates"
                ],
                "properties": {
                  "certificates": {
                    "type": "integer"
                  },
                  "valid": {
                    "type": "integer"
                  },
                  "expiring": {
                    "type": "integer"
                  },
                  "expired": {
                    "type": "integer"
                  },
                  "wildcardCertificates": {
                    "type": "integer"
                  }
                }
              },
              "certificates": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "serial",
                    "crtShIds",
                    "issuer",
                    "issuerOrg",
                    "names",
                    "notBefore",
                    "notAfter",
                    "validityDays",
                    "wildcard",
                    "state"
                  ],
                  "properties": {
                    "serial": {
                      "type": "string"
                    },
                    "crtShIds": {
                      "type": "array",
                      "items": {
                        "type": "integer"
                      }
                    },
                    "issuer": {
                      "type": "string"
                    },
                    "issuerOrg": {
                      "type": "string"
                    },
                    "names": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "notBefore": {
                      "type": "string"
                    },
                    "notAfter": {
                      "type": "string"
                    },
                    "validityDays": {
                      "type": "integer"
                    },
                    "wildcard": {
                      "type": "boolean"
                    },
                    "state": {
                      "type": "string",
                      "enum": [
                        "valid",
                        "expiring",
                        "expired",
                        "not-yet-valid"
                      ]
                    }
                  }
                }
              },
              "names": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "name",
                    "inDomain",
                    "wildcard",
                    "firstSeen",
                    "lastSeen",
                    "latestExpiry",
                    "certificates",
                    "issuers",
                    "coverage"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "inDomain": {
                      "type": "boolean"
                    },
                    "wildcard": {
                      "type": "boolean"
                    },
                    "firstSeen": {
                      "type": "string"
                    },
                    "lastSeen": {
                      "type": "string"
                    },
                    "latestExpiry": {
                      "type": "string"
                    },
                    "certificates": {
                      "type": "integer"
                    },
                    "issuers": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "coverage": {
                      "type": "string",
                      "enum": [
                        "covered",
                        "expiring",
                        "expired"
                      ]
                    }
                  }
                }
              },
              "subdomains": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "name",
                    "inDomain",
                    "wildcard",
                    "firstSeen",
                    "lastSeen",
                    "latestExpiry",
                    "certificates",
                    "issuers",
                    "coverage"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "inDomain": {
                      "type": "boolean"
                    },
                    "wildcard": {
                      "type": "boolean"
                    },
                    "firstSeen": {
                      "type": "string"
                    },
                    "lastSeen": {
                      "type": "string"
                    },
                    "latestExpiry": {
                      "type": "string"
                    },
                    "certificates": {
                      "type": "integer"
                    },
                    "issuers": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "coverage": {
                      "type": "string",
                      "enum": [
                        "covered",
                        "expiring",
                        "expired"
                      ]
                    }
                  }
                }
              },
              "wildcards": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "name",
                    "inDomain",
                    "wildcard",
                    "firstSeen",
                    "lastSeen",
                    "latestExpiry",
                    "certificates",
                    "issuers",
                    "coverage"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "inDomain": {
                      "type": "boolean"
                    },
                    "wildcard": {
                      "type": "boolean"
                    },
                    "firstSeen": {
                      "type": "string"
                    },
                    "lastSeen": {
                      "type": "string"
                    },
                    "latestExpiry": {
                      "type": "string"
                    },
                    "certificates": {
                      "type": "integer"
                    },
                    "issuers": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "coverage": {
                      "type": "string",
                      "enum": [
                        "covered",
                        "expiring",
                        "expired"
                      ]
                    }
                  }
                }
              },
              "relatedDomains": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "issuers": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "issuer",
                    "certificates",
                    "firstIssued",
                    "lastIssued"
                  ],
                  "properties": {
                    "issuer": {
                      "type": "string"
                    },
                    "certificates": {
                      "type": "integer"
                    },
                    "firstIssued": {
                      "type": "string"
                    },
                    "lastIssued": {
                      "type": "string"
                    }
                  }
                }
              },
              "issuersOverTime": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "year",
                    "issuers"
                  ],
                  "properties": {
                    "year": {
                      "type": "string"
                    },
                    "issuers": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "issuer",
                          "count"
                        ],
                        "properties": {
                          "issuer": {
                            "type": "string"
                          },
                          "count": {
                            "type": "integer"
                          }
                        }
                      }
                    }
                  }
                }
              },
              "findings": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "severity",
                    "area",
                    "finding"
                  ],
                  "properties": {
                    "severity": {
                      "type": "string",
                      "enum": [
                        "high",
                        "medium",
                        "low",
                        "info"
                      ]
                    },
                    "area": {
                      "type": "string"
                    },
                    "finding": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "DomainHistoryGraphInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "enum": [
              "live",
              "paste"
            ],
            "default": "live"
          },
          "domain": {
            "title": "Domain",
            "type": "string",
            "maxLength": 253
          },
          "certificateTransparency": {
            "title": "Include Certificate Transparency history (crt.sh, slower)",
            "type": "boolean",
            "default": true
          },
          "rdapJson": {
            "title": "RDAP JSON (paste mode)",
            "type": "string",
            "maxLength": 300000
          },
          "cdxRows": {
            "title": "Wayback CDX rows (paste mode, optional)",
            "description": "JSON output (fl=timestamp,statuscode,digest) or plain CDX lines.",
            "type": "string",
            "maxLength": 300000
          },
          "ctJson": {
            "title": "crt.sh JSON (paste mode, optional)",
            "type": "string",
            "maxLength": 1000000
          }
        },
        "required": [
          "domain"
        ]
      },
      "DomainHistoryGraphResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "domain",
              "mode",
              "referenceTime",
              "registration",
              "ageYears",
              "daysToExpiry",
              "dns",
              "hosting",
              "certificates",
              "wayback",
              "findings"
            ],
            "properties": {
              "domain": {
                "type": "string"
              },
              "mode": {
                "type": "string",
                "enum": [
                  "live",
                  "paste"
                ]
              },
              "referenceTime": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "registration": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "ldhName",
                  "registrar",
                  "registrarIanaId",
                  "registrantOrganization",
                  "registrantCountry",
                  "status",
                  "nameservers",
                  "dnssec",
                  "events",
                  "contactRoles",
                  "redactedContactFields",
                  "rdapServer"
                ],
                "properties": {
                  "ldhName": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "registrar": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "registrarIanaId": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "registrantOrganization": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "registrantCountry": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "status": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "nameservers": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "dnssec": {
                    "type": [
                      "boolean",
                      "null"
                    ]
                  },
                  "events": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "action",
                        "date"
                      ],
                      "properties": {
                        "action": {
                          "type": "string"
                        },
                        "date": {
                          "type": "string"
                        }
                      }
                    }
                  },
                  "contactRoles": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "redactedContactFields": {
                    "type": "integer"
                  },
                  "rdapServer": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              },
              "ageYears": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "daysToExpiry": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "dns": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "hosting": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "ip",
                    "prefix",
                    "asn",
                    "holder"
                  ],
                  "properties": {
                    "ip": {
                      "type": "string"
                    },
                    "prefix": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "asn": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "holder": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                }
              },
              "certificates": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "certificates",
                  "firstSeen",
                  "latestIssued",
                  "issuers",
                  "names"
                ],
                "properties": {
                  "certificates": {
                    "type": "integer"
                  },
                  "firstSeen": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "latestIssued": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "issuers": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "issuer",
                        "count"
                      ],
                      "properties": {
                        "issuer": {
                          "type": "string"
                        },
                        "count": {
                          "type": "integer"
                        }
                      }
                    }
                  },
                  "names": {
                    "type": "integer"
                  }
                }
              },
              "wayback": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "firstCapture",
                  "lastCapture",
                  "sampled",
                  "distinctContent",
                  "statusCodes",
                  "captures"
                ],
                "properties": {
                  "firstCapture": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "lastCapture": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "sampled": {
                    "type": "integer"
                  },
                  "distinctContent": {
                    "type": "integer"
                  },
                  "statusCodes": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "integer"
                    }
                  },
                  "captures": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "timestamp",
                        "status",
                        "digest"
                      ],
                      "properties": {
                        "timestamp": {
                          "type": "string"
                        },
                        "status": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "digest": {
                          "type": [
                            "string",
                            "null"
                          ]
                        }
                      }
                    }
                  }
                }
              },
              "findings": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "BgpRouteExplorerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "enum": [
              "live",
              "pasted"
            ],
            "default": "live"
          },
          "resource": {
            "title": "IP address or prefix",
            "type": "string",
            "maxLength": 60
          },
          "lookingGlass": {
            "title": "Include current AS paths (RIS looking glass)",
            "type": "boolean",
            "default": true
          },
          "pasted": {
            "title": "RIPEstat responses (JSON)",
            "description": "Pasted mode: {resource?, prefixOverview, routingStatus?, routingHistory?, rpki?: [{origin, data}], lookingGlass?} — full RIPEstat responses or their \"data\" objects.",
            "type": "string",
            "maxLength": 200000
          }
        },
        "required": []
      },
      "BgpRouteExplorerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "queried",
              "prefix",
              "family",
              "announced",
              "block",
              "origins",
              "visibility",
              "firstSeen",
              "lastSeen",
              "moreSpecifics",
              "moreSpecificsCount",
              "lessSpecifics",
              "history",
              "historicalOrigins",
              "events",
              "lookingGlass",
              "findings"
            ],
            "properties": {
              "queried": {
                "type": "string"
              },
              "prefix": {
                "type": "string"
              },
              "family": {
                "type": "string",
                "enum": [
                  "IPv4",
                  "IPv6"
                ]
              },
              "announced": {
                "type": "boolean"
              },
              "block": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "resource",
                  "description"
                ],
                "properties": {
                  "resource": {
                    "type": "string"
                  },
                  "description": {
                    "type": "string"
                  }
                }
              },
              "origins": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "asn",
                    "holder",
                    "rpki",
                    "validatingRoas",
                    "irrRouteObjects"
                  ],
                  "properties": {
                    "asn": {
                      "type": "integer"
                    },
                    "holder": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "rpki": {
                      "type": "string",
                      "enum": [
                        "valid",
                        "invalid_asn",
                        "invalid_length",
                        "unknown",
                        "not-checked"
                      ]
                    },
                    "validatingRoas": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "origin",
                          "prefix",
                          "maxLength",
                          "validity"
                        ],
                        "properties": {
                          "origin": {
                            "type": "integer"
                          },
                          "prefix": {
                            "type": "string"
                          },
                          "maxLength": {
                            "type": [
                              "integer",
                              "null"
                            ]
                          },
                          "validity": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "irrRouteObjects": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              },
              "visibility": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "family",
                  "peersSeeing",
                  "totalPeers",
                  "percent"
                ],
                "properties": {
                  "family": {
                    "type": "string"
                  },
                  "peersSeeing": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "totalPeers": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "percent": {
                    "type": [
                      "number",
                      "null"
                    ]
                  }
                }
              },
              "firstSeen": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "time",
                  "origin",
                  "prefix"
                ],
                "properties": {
                  "time": {
                    "type": "string"
                  },
                  "origin": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "prefix": {
                    "type": "string"
                  }
                }
              },
              "lastSeen": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "time",
                  "origin",
                  "prefix"
                ],
                "properties": {
                  "time": {
                    "type": "string"
                  },
                  "origin": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "prefix": {
                    "type": "string"
                  }
                }
              },
              "moreSpecifics": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "prefix",
                    "origin"
                  ],
                  "properties": {
                    "prefix": {
                      "type": "string"
                    },
                    "origin": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    }
                  }
                }
              },
              "moreSpecificsCount": {
                "type": "integer"
              },
              "lessSpecifics": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "prefix",
                    "origin"
                  ],
                  "properties": {
                    "prefix": {
                      "type": "string"
                    },
                    "origin": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    }
                  }
                }
              },
              "history": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "origin",
                    "prefix",
                    "firstSeen",
                    "lastSeen",
                    "segments",
                    "current",
                    "maxPeersSeeing"
                  ],
                  "properties": {
                    "origin": {
                      "type": "integer"
                    },
                    "prefix": {
                      "type": "string"
                    },
                    "firstSeen": {
                      "type": "string"
                    },
                    "lastSeen": {
                      "type": "string"
                    },
                    "segments": {
                      "type": "integer"
                    },
                    "current": {
                      "type": "boolean"
                    },
                    "maxPeersSeeing": {
                      "type": [
                        "number",
                        "null"
                      ]
                    }
                  }
                }
              },
              "historicalOrigins": {
                "type": "array",
                "items": {
                  "type": "integer"
                }
              },
              "events": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "time",
                    "label",
                    "detail",
                    "tone"
                  ],
                  "properties": {
                    "time": {
                      "type": "string"
                    },
                    "label": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    },
                    "tone": {
                      "type": "string"
                    }
                  }
                }
              },
              "lookingGlass": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "collectors",
                  "peers",
                  "upstreams",
                  "averagePathLength",
                  "samplePaths"
                ],
                "properties": {
                  "collectors": {
                    "type": "integer"
                  },
                  "peers": {
                    "type": "integer"
                  },
                  "averagePathLength": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "upstreams": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "asn",
                        "paths"
                      ],
                      "properties": {
                        "asn": {
                          "type": "integer"
                        },
                        "paths": {
                          "type": "integer"
                        }
                      }
                    }
                  },
                  "samplePaths": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "collector",
                        "peer",
                        "path",
                        "lastUpdated"
                      ],
                      "properties": {
                        "collector": {
                          "type": "string"
                        },
                        "peer": {
                          "type": "string"
                        },
                        "path": {
                          "type": "string"
                        },
                        "lastUpdated": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              },
              "findings": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "severity",
                    "area",
                    "finding"
                  ],
                  "properties": {
                    "severity": {
                      "type": "string",
                      "enum": [
                        "high",
                        "medium",
                        "low",
                        "info"
                      ]
                    },
                    "area": {
                      "type": "string"
                    },
                    "finding": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "AsnRelationshipExplorerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "enum": [
              "live",
              "pasted"
            ],
            "default": "live"
          },
          "asn": {
            "title": "AS number",
            "type": "string",
            "maxLength": 14
          },
          "maxNeighbours": {
            "title": "Neighbours in the graph",
            "type": "integer",
            "minimum": 1,
            "maximum": 55,
            "default": 25
          },
          "pasted": {
            "title": "RIPEstat responses (JSON)",
            "description": "Pasted mode: {asn, asOverview, asnNeighbours?, announcedPrefixes?, rirStatsCountry?} — full RIPEstat responses or their \"data\" objects.",
            "type": "string",
            "maxLength": 200000
          }
        },
        "required": []
      },
      "AsnRelationshipExplorerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "asn",
              "holder",
              "country",
              "announced",
              "block",
              "neighbourCounts",
              "neighbours",
              "prefixCounts",
              "prefixes",
              "queryTime",
              "prefixWindow",
              "findings"
            ],
            "properties": {
              "asn": {
                "type": "integer"
              },
              "holder": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "country": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "announced": {
                "type": "boolean"
              },
              "block": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "resource",
                  "description"
                ],
                "properties": {
                  "resource": {
                    "type": "string"
                  },
                  "description": {
                    "type": "string"
                  }
                }
              },
              "neighbourCounts": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "left",
                  "right",
                  "uncertain",
                  "unique"
                ],
                "properties": {
                  "left": {
                    "type": "integer"
                  },
                  "right": {
                    "type": "integer"
                  },
                  "uncertain": {
                    "type": "integer"
                  },
                  "unique": {
                    "type": "integer"
                  }
                }
              },
              "neighbours": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "asn",
                    "type",
                    "power",
                    "v4Peers",
                    "v6Peers",
                    "holder"
                  ],
                  "properties": {
                    "asn": {
                      "type": "integer"
                    },
                    "type": {
                      "type": "string",
                      "enum": [
                        "left",
                        "right",
                        "uncertain"
                      ]
                    },
                    "power": {
                      "type": "integer"
                    },
                    "v4Peers": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "v6Peers": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "holder": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                }
              },
              "prefixCounts": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "ipv4",
                  "ipv6",
                  "ipv4Slash24Equivalents",
                  "ipv6Slash48Equivalents"
                ],
                "properties": {
                  "ipv4": {
                    "type": "integer"
                  },
                  "ipv6": {
                    "type": "integer"
                  },
                  "ipv4Slash24Equivalents": {
                    "type": "integer"
                  },
                  "ipv6Slash48Equivalents": {
                    "type": "integer"
                  }
                }
              },
              "prefixes": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "prefix",
                    "family",
                    "firstSeen",
                    "lastSeen",
                    "periods"
                  ],
                  "properties": {
                    "prefix": {
                      "type": "string"
                    },
                    "family": {
                      "type": "string",
                      "enum": [
                        "IPv4",
                        "IPv6"
                      ]
                    },
                    "firstSeen": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "lastSeen": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "periods": {
                      "type": "integer"
                    }
                  }
                }
              },
              "queryTime": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "prefixWindow": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "start",
                  "end"
                ],
                "properties": {
                  "start": {
                    "type": "string"
                  },
                  "end": {
                    "type": "string"
                  }
                }
              },
              "findings": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "severity",
                    "area",
                    "finding"
                  ],
                  "properties": {
                    "severity": {
                      "type": "string",
                      "enum": [
                        "high",
                        "medium",
                        "low",
                        "info"
                      ]
                    },
                    "area": {
                      "type": "string"
                    },
                    "finding": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "InternetOutageAtlasInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "enum": [
              "live",
              "paste"
            ],
            "default": "live"
          },
          "target": {
            "title": "Country code, ASN or domain",
            "type": "string",
            "maxLength": 253
          },
          "targetType": {
            "title": "Target type",
            "type": "string",
            "enum": [
              "auto",
              "country",
              "asn",
              "domain"
            ],
            "default": "auto"
          },
          "windowHours": {
            "title": "Look-back window",
            "type": "integer",
            "minimum": 1,
            "maximum": 720,
            "default": 48,
            "x-unit": "hours"
          },
          "pastedJson": {
            "title": "IODA alerts/events JSON (paste mode)",
            "description": "Response of /v2/outages/alerts or /v2/outages/events (or {\"alerts\":…, \"events\":…}).",
            "type": "string",
            "maxLength": 500000
          }
        },
        "required": [
          "target"
        ]
      },
      "InternetOutageAtlasResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "target",
              "targetType",
              "mode",
              "window",
              "entityName",
              "asn",
              "alertCount",
              "episodes",
              "events",
              "routing",
              "probe",
              "incidents",
              "status"
            ],
            "properties": {
              "target": {
                "type": "string"
              },
              "targetType": {
                "type": "string",
                "enum": [
                  "country",
                  "asn",
                  "domain"
                ]
              },
              "mode": {
                "type": "string",
                "enum": [
                  "live",
                  "paste"
                ]
              },
              "window": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "from",
                  "until"
                ],
                "properties": {
                  "from": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "until": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              },
              "entityName": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "asn": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "alertCount": {
                "type": "integer"
              },
              "episodes": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "datasource",
                    "start",
                    "end",
                    "worstLevel",
                    "minRatio"
                  ],
                  "properties": {
                    "datasource": {
                      "type": "string"
                    },
                    "start": {
                      "type": "string"
                    },
                    "end": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "worstLevel": {
                      "type": "string"
                    },
                    "minRatio": {
                      "type": [
                        "number",
                        "null"
                      ]
                    }
                  }
                }
              },
              "events": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "datasource",
                    "start",
                    "durationSeconds",
                    "score"
                  ],
                  "properties": {
                    "datasource": {
                      "type": "string"
                    },
                    "start": {
                      "type": "string"
                    },
                    "durationSeconds": {
                      "type": "integer"
                    },
                    "score": {
                      "type": [
                        "number",
                        "null"
                      ]
                    }
                  }
                }
              },
              "routing": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "visibilityV4",
                  "visibilityV6",
                  "prefixesV4",
                  "prefixesV6",
                  "bgpSpikes"
                ],
                "properties": {
                  "visibilityV4": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "visibilityV6": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "prefixesV4": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "prefixesV6": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "bgpSpikes": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "time",
                        "total",
                        "withdrawals"
                      ],
                      "properties": {
                        "time": {
                          "type": "string"
                        },
                        "total": {
                          "type": "integer"
                        },
                        "withdrawals": {
                          "type": "integer"
                        }
                      }
                    }
                  }
                }
              },
              "probe": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "url",
                  "reachable",
                  "status",
                  "error"
                ],
                "properties": {
                  "url": {
                    "type": "string"
                  },
                  "reachable": {
                    "type": "boolean"
                  },
                  "status": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "error": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              },
              "incidents": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "start",
                    "end",
                    "signals",
                    "confidence",
                    "detail"
                  ],
                  "properties": {
                    "start": {
                      "type": "string"
                    },
                    "end": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "signals": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "confidence": {
                      "type": "string",
                      "enum": [
                        "corroborated",
                        "single-signal"
                      ]
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              },
              "status": {
                "type": "string",
                "enum": [
                  "disruption-ongoing",
                  "recent-disruption",
                  "no-disruption-signals",
                  "insufficient-data"
                ]
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "AiWebsiteReadinessExplorerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "url": {
            "title": "Page URL",
            "type": "string",
            "format": "uri"
          },
          "html": {
            "title": "Or paste the page HTML (offline)",
            "type": "string",
            "maxLength": 3000000
          },
          "robotsTxt": {
            "title": "robots.txt content (offline mode)",
            "type": "string",
            "maxLength": 500000
          },
          "llmsTxt": {
            "title": "llms.txt content (offline mode, optional)",
            "type": "string",
            "maxLength": 500000
          }
        },
        "required": []
      },
      "AiWebsiteReadinessExplorerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "url",
              "score",
              "grade",
              "title",
              "bots",
              "jsonLdTypes",
              "checks",
              "topFixes"
            ],
            "properties": {
              "url": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "score": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100
              },
              "grade": {
                "type": "string",
                "enum": [
                  "A",
                  "B",
                  "C",
                  "D",
                  "F"
                ]
              },
              "title": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "bots": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "agent",
                    "operator",
                    "purpose",
                    "allowed",
                    "matchedGroup",
                    "rule"
                  ],
                  "properties": {
                    "agent": {
                      "type": "string"
                    },
                    "operator": {
                      "type": "string"
                    },
                    "purpose": {
                      "type": "string",
                      "enum": [
                        "training",
                        "search",
                        "user-request"
                      ]
                    },
                    "allowed": {
                      "type": "boolean"
                    },
                    "matchedGroup": {
                      "type": "string"
                    },
                    "rule": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                }
              },
              "jsonLdTypes": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "checks": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "id",
                    "area",
                    "status",
                    "points",
                    "max",
                    "detail"
                  ],
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "area": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "pass",
                        "warn",
                        "fail",
                        "info"
                      ]
                    },
                    "points": {
                      "type": "integer"
                    },
                    "max": {
                      "type": "integer"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              },
              "topFixes": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "A11ySnapshotInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "url": {
            "title": "Page URL",
            "description": "Fetched once, server-side, with the static HTML only (no JavaScript is executed).",
            "type": "string",
            "format": "uri"
          },
          "html": {
            "title": "Or paste HTML",
            "description": "Takes precedence over the URL. Useful for pages behind a login or local drafts.",
            "type": "string",
            "maxLength": 500000
          },
          "maxFindings": {
            "title": "Max findings listed",
            "type": "integer",
            "minimum": 5,
            "maximum": 500,
            "default": 100
          }
        },
        "required": []
      },
      "A11ySnapshotResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "origin",
              "stats",
              "totals",
              "findings",
              "findingsTruncated",
              "manualChecks",
              "criteriaWithFailures",
              "conformanceStatement"
            ],
            "properties": {
              "origin": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "kind",
                  "truncated"
                ],
                "properties": {
                  "kind": {
                    "type": "string",
                    "enum": [
                      "url",
                      "pasted"
                    ]
                  },
                  "requestedUrl": {
                    "type": "string"
                  },
                  "finalUrl": {
                    "type": "string"
                  },
                  "status": {
                    "type": "integer"
                  },
                  "contentType": {
                    "type": "string"
                  },
                  "fetchedAt": {
                    "type": "string"
                  },
                  "truncated": {
                    "type": "boolean"
                  }
                }
              },
              "stats": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "elements",
                  "images",
                  "imagesWithAlt",
                  "links",
                  "buttons",
                  "formControls",
                  "headings",
                  "h1Count",
                  "landmarks",
                  "tables",
                  "iframes",
                  "media",
                  "lang",
                  "title"
                ],
                "properties": {
                  "elements": {
                    "type": "integer"
                  },
                  "images": {
                    "type": "integer"
                  },
                  "imagesWithAlt": {
                    "type": "integer"
                  },
                  "links": {
                    "type": "integer"
                  },
                  "buttons": {
                    "type": "integer"
                  },
                  "formControls": {
                    "type": "integer"
                  },
                  "headings": {
                    "type": "integer"
                  },
                  "h1Count": {
                    "type": "integer"
                  },
                  "landmarks": {
                    "type": "integer"
                  },
                  "tables": {
                    "type": "integer"
                  },
                  "iframes": {
                    "type": "integer"
                  },
                  "media": {
                    "type": "integer"
                  },
                  "lang": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "title": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              },
              "totals": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "findings",
                  "failures",
                  "bestPractice",
                  "needsReview",
                  "critical",
                  "serious",
                  "moderate",
                  "minor"
                ],
                "properties": {
                  "findings": {
                    "type": "integer"
                  },
                  "failures": {
                    "type": "integer"
                  },
                  "bestPractice": {
                    "type": "integer"
                  },
                  "needsReview": {
                    "type": "integer"
                  },
                  "critical": {
                    "type": "integer"
                  },
                  "serious": {
                    "type": "integer"
                  },
                  "moderate": {
                    "type": "integer"
                  },
                  "minor": {
                    "type": "integer"
                  }
                }
              },
              "findings": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "ruleId",
                    "title",
                    "wcag",
                    "level",
                    "kind",
                    "severity",
                    "message",
                    "selector",
                    "line",
                    "snippet"
                  ],
                  "properties": {
                    "ruleId": {
                      "type": "string"
                    },
                    "title": {
                      "type": "string"
                    },
                    "wcag": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "pattern": "^\\d\\.\\d\\.\\d+$"
                      }
                    },
                    "level": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "enum": [
                        "A",
                        "AA",
                        null
                      ]
                    },
                    "kind": {
                      "type": "string",
                      "enum": [
                        "failure",
                        "best-practice",
                        "needs-review"
                      ]
                    },
                    "severity": {
                      "type": "string",
                      "enum": [
                        "critical",
                        "serious",
                        "moderate",
                        "minor"
                      ]
                    },
                    "message": {
                      "type": "string"
                    },
                    "selector": {
                      "type": "string"
                    },
                    "line": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "snippet": {
                      "type": "string"
                    }
                  }
                }
              },
              "findingsTruncated": {
                "type": "boolean"
              },
              "manualChecks": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "sc",
                    "title",
                    "level",
                    "reason"
                  ],
                  "properties": {
                    "sc": {
                      "type": "string"
                    },
                    "title": {
                      "type": "string"
                    },
                    "level": {
                      "type": "string",
                      "enum": [
                        "A",
                        "AA"
                      ]
                    },
                    "reason": {
                      "type": "string"
                    }
                  }
                }
              },
              "criteriaWithFailures": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "WCAG 2.2 success criteria with at least one automated failure."
              },
              "conformanceStatement": {
                "type": "string"
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "WebsiteChangeExplainerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "beforeUrl": {
            "title": "Before: URL",
            "description": "Fetched now. Usually you paste the old version below (e.g. from a saved copy or web archive).",
            "type": "string",
            "format": "uri"
          },
          "beforeContent": {
            "title": "Before: pasted HTML or text",
            "type": "string",
            "maxLength": 400000
          },
          "afterUrl": {
            "title": "After: URL",
            "description": "Fetched now (the live page).",
            "type": "string",
            "format": "uri"
          },
          "afterContent": {
            "title": "After: pasted HTML or text",
            "type": "string",
            "maxLength": 400000
          },
          "includeTrivial": {
            "title": "List trivial changes too",
            "type": "boolean",
            "default": false
          },
          "maxChanges": {
            "title": "Max changes listed",
            "type": "integer",
            "minimum": 5,
            "maximum": 500,
            "default": 50
          }
        },
        "required": []
      },
      "WebsiteChangeExplainerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "before",
              "after",
              "counts",
              "changes",
              "truncated",
              "unifiedDiff"
            ],
            "properties": {
              "before": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "origin",
                  "title",
                  "metaDescription",
                  "blockCount",
                  "headings",
                  "linkCount",
                  "prices",
                  "dates"
                ],
                "properties": {
                  "origin": {
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "truncated"
                    ],
                    "properties": {
                      "kind": {
                        "type": "string",
                        "enum": [
                          "url",
                          "pasted"
                        ]
                      },
                      "requestedUrl": {
                        "type": "string"
                      },
                      "finalUrl": {
                        "type": "string"
                      },
                      "status": {
                        "type": "integer"
                      },
                      "contentType": {
                        "type": "string"
                      },
                      "fetchedAt": {
                        "type": "string"
                      },
                      "truncated": {
                        "type": "boolean"
                      }
                    }
                  },
                  "title": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "metaDescription": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "blockCount": {
                    "type": "integer"
                  },
                  "headings": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "maxItems": 50
                  },
                  "linkCount": {
                    "type": "integer"
                  },
                  "prices": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "maxItems": 50
                  },
                  "dates": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "maxItems": 50
                  }
                }
              },
              "after": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "origin",
                  "title",
                  "metaDescription",
                  "blockCount",
                  "headings",
                  "linkCount",
                  "prices",
                  "dates"
                ],
                "properties": {
                  "origin": {
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "kind",
                      "truncated"
                    ],
                    "properties": {
                      "kind": {
                        "type": "string",
                        "enum": [
                          "url",
                          "pasted"
                        ]
                      },
                      "requestedUrl": {
                        "type": "string"
                      },
                      "finalUrl": {
                        "type": "string"
                      },
                      "status": {
                        "type": "integer"
                      },
                      "contentType": {
                        "type": "string"
                      },
                      "fetchedAt": {
                        "type": "string"
                      },
                      "truncated": {
                        "type": "boolean"
                      }
                    }
                  },
                  "title": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "metaDescription": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "blockCount": {
                    "type": "integer"
                  },
                  "headings": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "maxItems": 50
                  },
                  "linkCount": {
                    "type": "integer"
                  },
                  "prices": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "maxItems": 50
                  },
                  "dates": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "maxItems": 50
                  }
                }
              },
              "counts": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "meaningful",
                  "trivial",
                  "high",
                  "medium",
                  "low",
                  "blocksBefore",
                  "blocksAfter",
                  "unchangedBlocks"
                ],
                "properties": {
                  "meaningful": {
                    "type": "integer"
                  },
                  "trivial": {
                    "type": "integer"
                  },
                  "high": {
                    "type": "integer"
                  },
                  "medium": {
                    "type": "integer"
                  },
                  "low": {
                    "type": "integer"
                  },
                  "blocksBefore": {
                    "type": "integer"
                  },
                  "blocksAfter": {
                    "type": "integer"
                  },
                  "unchangedBlocks": {
                    "type": "integer"
                  }
                }
              },
              "changes": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "rank",
                    "kind",
                    "category",
                    "categories",
                    "significance",
                    "level",
                    "element",
                    "before",
                    "after",
                    "wordDiff",
                    "evidence"
                  ],
                  "properties": {
                    "rank": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "kind": {
                      "type": "string",
                      "enum": [
                        "modified",
                        "added",
                        "removed",
                        "title",
                        "meta-description",
                        "link"
                      ]
                    },
                    "category": {
                      "type": "string",
                      "enum": [
                        "price",
                        "legal-terms",
                        "contact",
                        "link-target",
                        "title",
                        "date",
                        "heading",
                        "number",
                        "meta-description",
                        "link-removed",
                        "link-added",
                        "text",
                        "trivial"
                      ]
                    },
                    "categories": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "price",
                          "legal-terms",
                          "contact",
                          "link-target",
                          "title",
                          "date",
                          "heading",
                          "number",
                          "meta-description",
                          "link-removed",
                          "link-added",
                          "text",
                          "trivial"
                        ]
                      }
                    },
                    "significance": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 100
                    },
                    "level": {
                      "type": "string",
                      "enum": [
                        "high",
                        "medium",
                        "low",
                        "trivial"
                      ]
                    },
                    "element": {
                      "type": "string"
                    },
                    "before": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "after": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "wordDiff": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Inline word diff: [-removed-] {+added+}."
                    },
                    "evidence": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              },
              "truncated": {
                "type": "boolean"
              },
              "unifiedDiff": {
                "type": "string"
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "ScamSignalCheckerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "message": {
            "title": "Message text",
            "description": "Paste the full e-mail, SMS or chat message. HTML source is fine (links inside <a href> are compared with their text).",
            "type": "string",
            "maxLength": 50000
          },
          "urls": {
            "title": "Links to check (one per line)",
            "description": "Optional. Copy links via right-click → \"Copy link address\". They are not opened.",
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 20
          },
          "senderAddress": {
            "title": "Sender address or number",
            "description": "Optional, e.g. the full e-mail address after \"From:\".",
            "type": "string",
            "maxLength": 320
          },
          "attachments": {
            "title": "Attachment file names (one per line)",
            "description": "Optional. Only the names are checked; do not upload the files.",
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 20
          }
        },
        "required": []
      },
      "ScamSignalCheckerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "score",
              "maxScore",
              "verdict",
              "verdictLabel",
              "confidence",
              "signals",
              "urls",
              "claimedBrands",
              "advice",
              "reportingResources"
            ],
            "properties": {
              "score": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100
              },
              "maxScore": {
                "type": "integer",
                "const": 100
              },
              "verdict": {
                "type": "string",
                "enum": [
                  "high-risk-signals",
                  "some-warning-signs",
                  "minor-signals",
                  "no-common-signals"
                ]
              },
              "verdictLabel": {
                "type": "string"
              },
              "confidence": {
                "type": "string",
                "const": "pattern-match"
              },
              "signals": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "id",
                    "label",
                    "weight",
                    "category",
                    "evidence",
                    "detail"
                  ],
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "label": {
                      "type": "string"
                    },
                    "weight": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "category": {
                      "type": "string",
                      "enum": [
                        "language",
                        "payment",
                        "credentials",
                        "link",
                        "sender",
                        "attachment"
                      ]
                    },
                    "evidence": {
                      "type": "string",
                      "description": "Exact sentence, URL or file name that triggered the rule."
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              },
              "urls": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "url",
                    "host",
                    "displayHost",
                    "registrableDomain",
                    "officialBrand",
                    "flags"
                  ],
                  "properties": {
                    "url": {
                      "type": "string"
                    },
                    "host": {
                      "type": "string"
                    },
                    "displayHost": {
                      "type": "string"
                    },
                    "registrableDomain": {
                      "type": "string"
                    },
                    "officialBrand": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "flags": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              },
              "claimedBrands": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "advice": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "reportingResources": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "name",
                    "url",
                    "note"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "note": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "BrowserCompatibilityCheckerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "query": {
            "title": "Feature",
            "description": "A BCD key (dot path) or search words.",
            "type": "string",
            "maxLength": 200,
            "default": "css.properties.container"
          },
          "source": {
            "title": "Data",
            "type": "string",
            "enum": [
              "live",
              "bundled"
            ],
            "default": "live"
          },
          "maxResults": {
            "title": "Maximum search results",
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 10
          }
        },
        "required": [
          "query"
        ]
      },
      "BrowserCompatibilityCheckerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "required": [
              "query",
              "matches",
              "data"
            ],
            "properties": {
              "query": {
                "type": "string"
              },
              "matches": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "feature": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "key": {
                    "type": "string"
                  },
                  "mdnUrl": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "specUrl": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "description": {
                    "type": "string"
                  },
                  "experimental": {
                    "type": "boolean"
                  },
                  "standardTrack": {
                    "type": "boolean"
                  },
                  "deprecated": {
                    "type": "boolean"
                  },
                  "baseline": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "properties": {
                      "status": {
                        "type": "string",
                        "enum": [
                          "high",
                          "low",
                          "limited"
                        ]
                      },
                      "lowDate": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "highDate": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "feature": {
                        "type": "string"
                      },
                      "name": {
                        "type": "string"
                      }
                    }
                  },
                  "support": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "browser",
                        "versionAdded",
                        "text",
                        "supported"
                      ],
                      "properties": {
                        "browser": {
                          "type": "string"
                        },
                        "versionAdded": {
                          "type": [
                            "string",
                            "boolean",
                            "null"
                          ]
                        },
                        "versionRemoved": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "text": {
                          "type": "string"
                        },
                        "supported": {
                          "type": "boolean"
                        },
                        "currentVersion": {
                          "type": [
                            "string",
                            "null"
                          ]
                        }
                      }
                    }
                  }
                }
              },
              "data": {
                "type": "object",
                "required": [
                  "origin",
                  "bcdVersion",
                  "bcdTimestamp"
                ],
                "properties": {
                  "origin": {
                    "type": "string",
                    "enum": [
                      "live",
                      "cache",
                      "bundled"
                    ]
                  },
                  "bcdVersion": {
                    "type": "string"
                  },
                  "bcdTimestamp": {
                    "type": "string"
                  },
                  "webFeaturesVersion": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "fetchedAt": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "featureCount": {
                    "type": "integer"
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "NetworkSpeedTesterInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "pingSamples": {
            "title": "Latency samples (ms)",
            "description": "Round-trip times in milliseconds, separated by commas or spaces. The browser test fills this in.",
            "type": "string",
            "maxLength": 5000
          },
          "downloadBytes": {
            "title": "Downloaded bytes",
            "type": "integer",
            "minimum": 0,
            "maximum": 10000000000
          },
          "downloadMs": {
            "title": "Download time",
            "type": "number",
            "minimum": 0,
            "maximum": 3600000,
            "x-unit": "ms"
          },
          "uploadBytes": {
            "title": "Uploaded bytes",
            "type": "integer",
            "minimum": 0,
            "maximum": 10000000000
          },
          "uploadMs": {
            "title": "Upload time",
            "type": "number",
            "minimum": 0,
            "maximum": 3600000,
            "x-unit": "ms"
          }
        },
        "required": []
      },
      "NetworkSpeedTesterResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "required": [
              "measured",
              "latency",
              "downloadMbps",
              "uploadMbps",
              "endpoints"
            ],
            "properties": {
              "measured": {
                "type": "boolean"
              },
              "latency": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "count": {
                    "type": "integer"
                  },
                  "min": {
                    "type": "number"
                  },
                  "median": {
                    "type": "number"
                  },
                  "mean": {
                    "type": "number"
                  },
                  "p90": {
                    "type": "number"
                  },
                  "max": {
                    "type": "number"
                  },
                  "jitter": {
                    "type": "number"
                  }
                }
              },
              "downloadMbps": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "uploadMbps": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "suitability": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "use",
                    "ok"
                  ],
                  "properties": {
                    "use": {
                      "type": "string"
                    },
                    "ok": {
                      "type": [
                        "boolean",
                        "null"
                      ]
                    },
                    "note": {
                      "type": "string"
                    }
                  }
                }
              },
              "endpoints": {
                "type": "object",
                "properties": {
                  "ping": {
                    "type": "string"
                  },
                  "download": {
                    "type": "string"
                  },
                  "upload": {
                    "type": "string"
                  },
                  "maxBytes": {
                    "type": "integer"
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "ExploreInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "query": {
            "title": "What do you want to explore?",
            "type": "string",
            "maxLength": 2048
          },
          "chain": {
            "title": "Chain (for hashes and addresses)",
            "type": "string",
            "enum": [
              "ethereum",
              "base",
              "arbitrum",
              "optimism",
              "polygon",
              "avalanche",
              "bsc"
            ],
            "default": "ethereum"
          }
        },
        "required": [
          "query"
        ]
      },
      "ExploreResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "query",
              "kind",
              "explorer",
              "label",
              "links",
              "summary",
              "result"
            ],
            "properties": {
              "query": {
                "type": "string"
              },
              "kind": {
                "type": "string",
                "enum": [
                  "transaction",
                  "contract",
                  "domain",
                  "package",
                  "advisory",
                  "mcp-server",
                  "website"
                ]
              },
              "explorer": {
                "type": "string",
                "description": "Tool id that produced the result"
              },
              "label": {
                "type": "string"
              },
              "links": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "human",
                  "api",
                  "explorer"
                ],
                "properties": {
                  "human": {
                    "type": "string"
                  },
                  "api": {
                    "type": "string"
                  },
                  "explorer": {
                    "type": "string"
                  }
                }
              },
              "summary": {
                "type": "string"
              },
              "result": {
                "type": "object",
                "description": "The explorer's own result object (see that tool's schema)."
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      }
    }
  }
}