{
  "openapi": "3.1.1",
  "info": {
    "title": "OBSCURIQ 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://obscuriq.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": [
                "obscuriq-indicator-extractor",
                "obscuriq-ioc-converter",
                "obscuriq-url-cleaner",
                "obscuriq-search-query-builder",
                "domain-history-graph",
                "dns-certificate-explorer",
                "certificate-transparency-explorer",
                "internet-archive-change-explorer",
                "transaction-decoder",
                "scam-signal-checker",
                "unicode-inspector",
                "exif-inspector-cleaner",
                "hash-hmac-calculator"
              ]
            }
          }
        ],
        "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/obscuriq-indicator-extractor/calculate": {
      "post": {
        "operationId": "calculateObscuriqIndicatorExtractor",
        "summary": "Find URLs, domains, IPs, e-mails, hashes and crypto identifiers in pasted text.",
        "description": "Extract URLs, email addresses, domains, IPv4 addresses, common hexadecimal hashes, checksum-valid Bitcoin addresses and 0x-prefixed Ethereum addresses and hashes from pasted text, including bracket-dot defanged forms.\n\nMethodology:\n- Identify conservative ASCII patterns for HTTP URLs, email addresses, domains, IPv4 addresses and 32-, 40- or 64-character hexadecimal hashes.\n- Bitcoin mainnet addresses count only when their Base58Check or Bech32/Bech32m checksum is valid; 0x followed by 40 hex characters is reported as an Ethereum address and 0x followed by 64 as an EVM hash (format only).\n- Tokens that end in a common file extension such as .pdf, .txt or .exe are treated as file names, not domains.\n- Keep the original matched text and count repeated indicators; domains, IPv4 addresses, hashes and Ethereum identifiers are grouped without regard to letter case and bracket-dot notation.\n\nMatches are leads, not evidence that a host exists, a file is malicious, or an address belongs to a person. Unicode domains, IPv6 and unusual email formats are not covered; review results manually.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "obscuriq_indicator_extractor",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ObscuriqIndicatorExtractorInput"
              },
              "examples": {
                "example1": {
                  "summary": "Extract indicators from a note",
                  "value": {
                    "text": "Suspicious link hxxps://example[.]org/login and analyst@example.org. Host 192.0.2.10 appears twice: 192.0.2.10."
                  }
                },
                "example2": {
                  "summary": "Find crypto identifiers",
                  "value": {
                    "text": "Donation page lists bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4 and 0x000000000000000000000000000000000000dEaD; the receipt mentions 0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObscuriqIndicatorExtractorResult"
                }
              }
            }
          },
          "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/obscuriq-ioc-converter/calculate": {
      "post": {
        "operationId": "calculateObscuriqIocConverter",
        "summary": "Make common indicators less clickable or restore them for analysis.",
        "description": "Convert recognized HTTP URLs, email domains, domains and IPv4 addresses in pasted text between normal and bracket-dot defanged notation. Hashes and crypto identifiers stay unchanged.\n\nMethodology:\n- Recognize the same conservative indicator patterns as the extractor; preserve surrounding text and punctuation.\n- Defanging replaces HTTP schemes with hxxp/hxxps and dots in hostnames with [.] while keeping URL paths intact. Refanging reverses these forms.\n\nRefanged indicators can become clickable or active. Do not open unknown links. Defanging is a formatting aid, not a security guarantee; unsupported patterns may remain unchanged.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "obscuriq_ioc_converter",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ObscuriqIocConverterInput"
              },
              "examples": {
                "example1": {
                  "summary": "Defang a link",
                  "value": {
                    "text": "Visit https://example.org/path and mail analyst@example.org",
                    "mode": "defang"
                  }
                },
                "example2": {
                  "summary": "Restore a link",
                  "value": {
                    "text": "hxxps://example[.]org/path",
                    "mode": "refang"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObscuriqIocConverterResult"
                }
              }
            }
          },
          "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/obscuriq-url-cleaner/calculate": {
      "post": {
        "operationId": "calculateObscuriqUrlCleaner",
        "summary": "Remove common campaign tracking parameters while retaining the original link.",
        "description": "Review and remove a named set of common tracking query parameters from an HTTP or HTTPS URL without opening the link.\n\nMethodology:\n- Parse the supplied HTTP or HTTPS URL for validity without requesting it.\n- Remove query parameters whose decoded names start with utm_ or match fbclid, gclid, dclid, msclkid, mc_cid, mc_eid, _ga, _gl or igshid; retain other query bytes and the fragment.\n\nA cleaned URL may still contain identifiers or tracking in other parameters, its path or fragment. Removing parameters can break signed or application-specific links; retain the original as evidence and compare before use.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "obscuriq_url_cleaner",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ObscuriqUrlCleanerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Clean a campaign link",
                  "value": {
                    "url": "https://example.org/article?id=42&utm_source=mail&fbclid=abc#details"
                  }
                },
                "example2": {
                  "summary": "A link without tracking parameters",
                  "value": {
                    "url": "https://example.org/report?page=2"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObscuriqUrlCleanerResult"
                }
              }
            }
          },
          "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/obscuriq-search-query-builder/calculate": {
      "post": {
        "operationId": "calculateObscuriqSearchQueryBuilder",
        "summary": "Prepare focused public-web searches without submitting them.",
        "description": "Create exact-phrase, PDF and optional domain-restricted search queries from a phrase and optional exclusion.\n\nMethodology:\n- Wrap the phrase in quotation marks and optionally add a quoted exclusion.\n- Produce exact phrase and filetype:pdf variations; add a site: query when a hostname is supplied.\n\nSearch engines differ in operator support and indexing. Results may be incomplete or stale; a query is a lead, not verification. Submitting a query to an external service reveals it to that service.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "obscuriq_search_query_builder",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ObscuriqSearchQueryBuilderInput"
              },
              "examples": {
                "example1": {
                  "summary": "Prepare focused queries",
                  "value": {
                    "subject": "example research project",
                    "domain": "example.org",
                    "exclude": "advertisement"
                  }
                },
                "example2": {
                  "summary": "Phrase only",
                  "value": {
                    "subject": "annual transparency report",
                    "domain": "",
                    "exclude": ""
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObscuriqSearchQueryBuilderResult"
                }
              }
            }
          },
          "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/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/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/internet-archive-change-explorer/calculate": {
      "post": {
        "operationId": "calculateInternetArchiveChangeExplorer",
        "summary": "See how a web page changed in the Wayback Machine: capture timeline plus the changes that matter.",
        "description": "Lists the distinct Wayback Machine captures of a URL, picks the captures closest to two dates (or exact timestamps), fetches both raw archived versions and diffs them, ranking meaningful changes — prices, headings, legal/policy terms, dates, contacts, links — above noise. Paste CDX rows and two HTML versions to analyse offline.\n\nMethodology:\n- Capture list: Wayback CDX API GET https://web.archive.org/cdx/search/cdx?url=…&output=json&fl=timestamp,original,statuscode,digest,length,mimetype&filter=statuscode:200&filter=mimetype:text/html, one capture per day (collapse=timestamp:8) — or per month for spans over 900 days. A new \"version\" starts whenever the content digest (SHA-1) changes.\n- Capture selection: exact 14-digit timestamps if given, otherwise the successful HTML capture closest to each date, taken from the timeline query (from = before − 30 days, to = after + 30 days); only if that is empty does the tool fall back to CDX closest=…&sort=closest&limit=1.\n- Archived pages are fetched raw (without the Wayback toolbar or URL rewriting) from https://web.archive.org/web/<timestamp>id_/<original URL>. Identical digests skip the fetch.\n- The two versions are compared with the Website Change Explainer engine: block-level LCS diff, word diffs, and rule-based categories (price, legal/policy terms, contact, link target, title, date, heading, number) ranked above trivial noise (whitespace, timestamps, copyright years, tracking parameters).\n- Similarity is the Dice coefficient over the words of the extracted page text (htmlToText).\n- Caveats: digests also change for http/https/www variants, embedded tokens or ads; the archive may miss periods; content loaded by JavaScript after page load is usually not in the raw HTML.",
        "tags": [
          "public-data"
        ],
        "x-mcp-tool": "internet_archive_change_explorer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InternetArchiveChangeExplorerInput"
              },
              "examples": {
                "example1": {
                  "summary": "example.com: Aug 2025 vs Sep 2026 (pasted CDX rows + archived HTML)",
                  "value": {
                    "url": "https://example.com/",
                    "beforeTimestamp": "20250801002042",
                    "afterTimestamp": "20260901000146",
                    "maxCaptures": 40,
                    "maxChanges": 25,
                    "pastedCdx": "[[\"timestamp\",\"original\",\"statuscode\",\"digest\",\"length\",\"mimetype\"],[\"20240701002435\",\"http://www.example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"699\",\"text/html\"],[\"20240801010121\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"751\",\"text/html\"],[\"20240901000219\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"1074\",\"text/html\"],[\"20241001000436\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"713\",\"text/html\"],[\"20241101002130\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"711\",\"text/html\"],[\"20241201001928\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"1263\",\"text/html\"],[\"20250101004557\",\"https://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"1232\",\"text/html\"],[\"20250201012603\",\"http://user:pass@example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"1202\",\"text/html\"],[\"20250301003025\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"1211\",\"text/html\"],[\"20250401000301\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"745\",\"text/html\"],[\"20250501001414\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"740\",\"text/html\"],[\"20250601000522\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"743\",\"text/html\"],[\"20250701005008\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"746\",\"text/html\"],[\"20250801002042\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"737\",\"text/html\"],[\"20250901000034\",\"https://example.com/\",\"200\",\"YXWQ7LLPPIZ7CVO6DVQ4U3Y2IO5M42AG\",\"1345\",\"text/html\"],[\"20251001001217\",\"https://example.com/\",\"200\",\"YXWQ7LLPPIZ7CVO6DVQ4U3Y2IO5M42AG\",\"1375\",\"text/html\"],[\"20251101000454\",\"https://www.example.com/\",\"200\",\"JUWMXAQNHPTRTHYQWT3EJILYCL7YC3PQ\",\"961\",\"text/html\"],[\"20251201000848\",\"http://www.example.com/\",\"200\",\"JUWMXAQNHPTRTHYQWT3EJILYCL7YC3PQ\",\"937\",\"text/html\"],[\"20260101000936\",\"http://www.example.com/\",\"200\",\"JUWMXAQNHPTRTHYQWT3EJILYCL7YC3PQ\",\"1009\",\"text/html\"],[\"20260201000022\",\"https://example.com/\",\"200\",\"4N5T7URO6PDNDBFG3V3AAQ45MXR3EXWK\",\"1040\",\"text/html\"],[\"20260301000114\",\"https://example.com/\",\"200\",\"UB6ILJGAIGCZBRVPWK2UVEWKHOYWSIYT\",\"1054\",\"text/html\"],[\"20260401000016\",\"https://example.com/\",\"200\",\"M7CPWPJVRUMERYFUWXWAHQRA4HOEEEXZ\",\"1042\",\"text/html\"],[\"20260501000121\",\"https://example.com/\",\"200\",\"M7CPWPJVRUMERYFUWXWAHQRA4HOEEEXZ\",\"1041\",\"text/html\"],[\"20260601000130\",\"https://example.com/\",\"200\",\"M7CPWPJVRUMERYFUWXWAHQRA4HOEEEXZ\",\"1041\",\"text/html\"],[\"20260701000143\",\"https://example.com/\",\"200\",\"PKUMGV5XIIUJG5CKD4HZMCRWKUMVP5S6\",\"1050\",\"text/html\"],[\"20260801000202\",\"https://example.com/\",\"200\",\"PKUMGV5XIIUJG5CKD4HZMCRWKUMVP5S6\",\"1049\",\"text/html\"],[\"20260901000146\",\"https://example.com/\",\"200\",\"PKUMGV5XIIUJG5CKD4HZMCRWKUMVP5S6\",\"1050\",\"text/html\"]]",
                    "pastedBefore": "<!doctype html>\n<html>\n<head>\n    <title>Example Domain</title>\n\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <style type=\"text/css\">\n    body {\n        background-color: #f0f0f2;\n        margin: 0;\n        padding: 0;\n        font-family: -apple-system, system-ui, BlinkMacSystemFont, \"Segoe UI\", \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n        \n    }\n    div {\n        width: 600px;\n        margin: 5em auto;\n        padding: 2em;\n        background-color: #fdfdff;\n        border-radius: 0.5em;\n        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);\n    }\n    a:link, a:visited {\n        color: #38488f;\n        text-decoration: none;\n    }\n    @media (max-width: 700px) {\n        div {\n            margin: 0 auto;\n            width: auto;\n        }\n    }\n    </style>    \n</head>\n\n<body>\n<div>\n    <h1>Example Domain</h1>\n    <p>This domain is for use in illustrative examples in documents. You may use this\n    domain in literature without prior coordination or asking for permission.</p>\n    <p><a href=\"https://www.iana.org/domains/example\">More information...</a></p>\n</div>\n</body>\n</html>\n",
                    "pastedAfter": "<!doctype html><html lang=\"en\"><head><title>Example Domain</title><link rel=\"icon\" href=\"data:,\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><style>body{background:#eee;width:60vw;margin:15vh auto;font-family:system-ui,sans-serif}h1{font-size:1.5em}div{opacity:0.8}a:link,a:visited{color:#348}</style></head><body><div><h1>Example Domain</h1><p>This domain is for use in documentation examples without needing permission. Avoid use in operations.</p><p><a href=\"https://iana.org/domains/example\">Learn more</a></p></div></body></html>\n"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InternetArchiveChangeExplorerResult"
                }
              }
            }
          },
          "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/transaction-decoder/calculate": {
      "post": {
        "operationId": "calculateTransactionDecoder",
        "summary": "See what an EVM transaction actually did: call, events, token transfers, fee, finality.",
        "description": "Looks up a transaction on Ethereum, Base, Arbitrum, OP Mainnet, Polygon, Avalanche or BNB Chain straight from a public RPC node and decodes it locally: the function called (from the verified ABI on Sourcify, a built-in table or the signature database), every event log, ERC-20 token transfers with symbols and decimals, gas fee, status and finality. Works offline for raw calldata too.\n\nMethodology:\n- Raw data comes from public JSON-RPC nodes: eth_getTransactionByHash, eth_getTransactionReceipt, eth_getBlockByNumber (timestamp, \"finalized\" tag) and eth_blockNumber.\n- Function: the first 4 bytes (selector) are matched against, in order, your signature/ABI, the verified ABI of the called contract on Sourcify, a built-in table of common functions, then the Sourcify signature database. The first candidate that ABI-decodes cleanly is used; other candidates are listed (selector collisions exist).\n- Events: topic0 is matched the same way. Without a verified ABI, the first (topics − 1) parameters are assumed to be indexed (flagged as indexingAssumed).\n- Token transfers: Transfer(address,address,uint256) logs with exactly 3 topics (ERC-20; ERC-721 has 4); symbol() and decimals() are read with eth_call.\n- Fake-token check: transfers of a token whose symbol is USDT/USDC/WETH/DAI but whose contract is not the official one on that chain are flagged.\n- Finality: \"finalized\" if the block is at or below the chain's \"finalized\" block tag; otherwise \"unfinalized\" with the confirmation count; \"unknown\" if the node does not support the tag.",
        "tags": [
          "web3"
        ],
        "x-mcp-tool": "transaction_decoder",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TransactionDecoderInput"
              },
              "examples": {
                "example1": {
                  "summary": "Decode an ERC-20 transfer (offline)",
                  "value": {
                    "mode": "calldata",
                    "chain": "ethereum",
                    "calldata": "0xa9059cbb0000000000000000000000005aaeb6053f3e94c9b9a09f33669435e7ef1beaed00000000000000000000000000000000000000000000000000000000004c4b40"
                  }
                },
                "example2": {
                  "summary": "Custom signature with a tuple (offline)",
                  "value": {
                    "mode": "calldata",
                    "chain": "base",
                    "signature": "setConfig((address,uint256,bool),string)",
                    "calldata": "0xc48cfc700000000000000000000000005aaeb6053f3e94c9b9a09f33669435e7ef1beaed000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000056869676821000000000000000000000000000000000000000000000000000000"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransactionDecoderResult"
                }
              }
            }
          },
          "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/unicode-inspector/calculate": {
      "post": {
        "operationId": "calculateUnicodeInspector",
        "summary": "Every code point with name, script and bytes, plus hidden characters and look-alikes.",
        "description": "Breaks text into code points with U+ value, name, general category, script and UTF-8/UTF-16 encoding; counts graphemes; compares NFC/NFD/NFKC/NFKD forms; and flags zero-width and invisible characters, bidirectional controls (Trojan Source) and mixed-script look-alike words used in phishing.\n\nMethodology:\n- The text is split into Unicode code points. General category and script come from the JavaScript regular-expression Unicode property tables of the server (\\p{gc=…}, \\p{Script=…}), which follow the Unicode version of its ICU build.\n- Names: the complete Unicode name list is about 2 MB, so a compact built-in table covers ASCII, Latin-1, basic Greek and Cyrillic, all invisible/format/space characters, common punctuation and variation selectors; CJK ideographs, Hangul syllables, fullwidth forms and tag characters are named algorithmically. Other characters show no name.\n- Grapheme clusters (user-perceived characters) are counted with Intl.Segmenter. Normalization forms come from String.prototype.normalize.\n- Invisible: zero-width characters, format characters (Cf), fillers, variation selectors and tag characters. Bidi controls (U+202A–202E, U+2066–2069) can make source code display differently from how it compiles (CVE-2021-42574, \"Trojan Source\").\n- Look-alikes: words mixing scripts (e.g. Latin + Cyrillic) and characters from a curated subset of Unicode confusables.txt are flagged; the skeleton maps them to Latin for comparison. This is a subset, not the full UTS #39 algorithm.",
        "tags": [
          "developer"
        ],
        "x-mcp-tool": "unicode_inspector",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UnicodeInspectorInput"
              },
              "examples": {
                "example1": {
                  "summary": "Look-alike domain (Cyrillic \"а\" in paypal) with a zero-width space",
                  "value": {
                    "text": "pаypal​.com"
                  }
                },
                "example2": {
                  "summary": "Trojan Source: right-to-left override in code",
                  "value": {
                    "text": "access_level != \"user‮ ⁦// Check if admin⁩ ⁦\""
                  }
                },
                "example3": {
                  "summary": "Emoji family, combining accents and fullwidth letters",
                  "value": {
                    "text": "Café 👨‍👩‍👧 ＡＢＣ"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnicodeInspectorResult"
                }
              }
            }
          },
          "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/exif-inspector-cleaner/calculate": {
      "post": {
        "operationId": "calculateExifInspectorCleaner",
        "summary": "See all photo metadata (EXIF, GPS, XMP, IPTC, MakerNotes) and download a cleaned copy.",
        "description": "Lists every metadata tag in a photo, grouped into EXIF, GPS, XMP, IPTC, MakerNotes and colour profile, and warns when the picture reveals where it was taken. Creates a cleaned copy without re-compressing the image: remove everything, only the GPS location, or everything except orientation and colour profile, then checks the cleaned file to prove it.\n\nMethodology:\n- exiftool reads every metadata block (-a -G0:1). Tags are grouped by where they live: EXIF (IFD0/ExifIFD), GPS (the GPS IFD plus XMP GPS tags), XMP, IPTC, MakerNotes (manufacturer data such as serial numbers), the ICC colour profile and file structure. Server-side file system entries (temporary names, dates) are not shown.\n- GPS coordinates are shown as decimal degrees so you can see what others could see. No map service is contacted.\n- Cleaning edits the metadata only; the compressed image data is copied unchanged (no re-encoding, no quality loss). \"Remove all\" deletes every writable tag (including the colour profile); \"Only GPS\" deletes the GPS IFD and all GPS* tags; \"Keep orientation and colour profile\" deletes everything, then copies back Orientation and the colour-space tags (ICC profile, ColorSpace).\n- Verification re-reads the cleaned file with exiftool and counts remaining tags per group; for JPG, PNG, WebP, GIF and TIFF ImageMagick also compares a hash of the decoded pixels before and after.\n- RAW files are inspect-only: deleting their metadata can make them undecodable.\n\nMetadata is only one way photos leak information: faces, street signs and reflections in the picture itself are not removed.",
        "tags": [
          "media"
        ],
        "x-mcp-tool": "exif_inspector_cleaner",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExifInspectorCleanerInput"
              },
              "examples": {
                "example1": {
                  "summary": "JPEG with camera and GPS tags → remove all",
                  "value": {
                    "file": {
                      "filename": "holiday.jpg",
                      "contentType": "image/jpeg",
                      "contentBase64": "/9j/4AAQSkZJRgABAQAAAAAAAAD/4QFgRXhpZgAATU0AKgAAAAgACAEPAAIAAAALAAAAbgEQAAIAAAAFAAAAegEaAAUAAAABAAAAgAEbAAUAAAABAAAAiAEoAAMAAAABAAEAAAITAAMAAAABAAEAAIdpAAQAAAABAAAAkIglAAQAAAABAAAA5gAAAABFeGFtcGxlQ2FtAABYMTAwAAAAAAAAAAAAAQAAAAAAAAABAAWQAAAHAAAABDAyMzKQAwACAAAAFAAAANKRAQAHAAAABAECAwCgAAAHAAAABDAxMDCgAQADAAAAAf//AAAAAAAAMjAyNDowNTowMSAxMjowMDowMAAABQAAAAEAAAAEAgMAAAABAAIAAAACTgAAAAACAAUAAAADAAABKAADAAIAAAACRQAAAAAEAAUAAAADAAABQAAAAAAAAAAwAAAAAQAAAAgAAAABAAAAQgAAAAUAAAALAAAAAQAAACIAAAABAAAAHgAAAAH/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCAAQABADASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAX/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/8QAFAEBAAAAAAAAAAAAAAAAAAAABf/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AKoBga//2Q=="
                    },
                    "action": "all"
                  }
                },
                "example2": {
                  "summary": "Remove only the GPS location",
                  "value": {
                    "file": {
                      "filename": "holiday.jpg",
                      "contentType": "image/jpeg",
                      "contentBase64": "/9j/4AAQSkZJRgABAQAAAAAAAAD/4QFgRXhpZgAATU0AKgAAAAgACAEPAAIAAAALAAAAbgEQAAIAAAAFAAAAegEaAAUAAAABAAAAgAEbAAUAAAABAAAAiAEoAAMAAAABAAEAAAITAAMAAAABAAEAAIdpAAQAAAABAAAAkIglAAQAAAABAAAA5gAAAABFeGFtcGxlQ2FtAABYMTAwAAAAAAAAAAAAAQAAAAAAAAABAAWQAAAHAAAABDAyMzKQAwACAAAAFAAAANKRAQAHAAAABAECAwCgAAAHAAAABDAxMDCgAQADAAAAAf//AAAAAAAAMjAyNDowNTowMSAxMjowMDowMAAABQAAAAEAAAAEAgMAAAABAAIAAAACTgAAAAACAAUAAAADAAABKAADAAIAAAACRQAAAAAEAAUAAAADAAABQAAAAAAAAAAwAAAAAQAAAAgAAAABAAAAQgAAAAUAAAALAAAAAQAAACIAAAABAAAAHgAAAAH/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCAAQABADASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAX/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/8QAFAEBAAAAAAAAAAAAAAAAAAAABf/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AKoBga//2Q=="
                    },
                    "action": "gps"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExifInspectorCleanerResult"
                }
              }
            }
          },
          "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/hash-hmac-calculator/calculate": {
      "post": {
        "operationId": "calculateHashHmacCalculator",
        "summary": "MD5, SHA-2, SHA-3, BLAKE2, CRC32 and HMAC of text or files, with checksum compare.",
        "description": "Computes MD5, SHA-1, SHA-224/256/384/512, SHA3-256/512, BLAKE2b-512, BLAKE2s-256 and CRC-32 of text or a file, or an HMAC with your key, in hex or Base64, and checks a published checksum against all of them. With JavaScript on, files and keys are hashed locally in your browser.\n\nMethodology:\n- The input bytes are the file as uploaded, or the text decoded as UTF-8, hex or Base64. Text is hashed exactly as entered: no newline is appended (unlike `echo` without `-n`).\n- Digests come from OpenSSL via Node.js crypto (MD5, SHA-1, SHA-2, SHA-3, BLAKE2b-512, BLAKE2s-256) and zlib (CRC-32, IEEE polynomial, shown big-endian as in `crc32`/`cksum -a crc32b`).\n- With a key, HMAC (RFC 2104) is computed for every selected hash; CRC-32 has no HMAC. SHA-3 HMACs use the SHA-3 rate as block size (NIST), BLAKE2 HMACs the BLAKE2 block size, as OpenSSL does.\n- The comparison accepts hex (any case, optional spaces or colons) or Base64 and reports which algorithm matches.\n- With JavaScript on, the browser computes everything locally: SHA-1/2 via WebCrypto, MD5, SHA-224, SHA-3, BLAKE2 and CRC-32 via small built-in JavaScript implementations. Files and keys never leave your device.\n\nMD5, SHA-1 and CRC-32 must not be used where an attacker could craft collisions. To store passwords use a password hash (Argon2id, scrypt, bcrypt), not a plain hash.",
        "tags": [
          "crypto"
        ],
        "x-mcp-tool": "hash_hmac_calculator",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HashHmacCalculatorInput"
              },
              "examples": {
                "example1": {
                  "summary": "Hashes of \"hello world\"",
                  "value": {
                    "text": "hello world"
                  }
                },
                "example2": {
                  "summary": "HMAC-SHA256 (RFC 4231 test case 2)",
                  "value": {
                    "text": "what do ya want for nothing?",
                    "hmacKey": "Jefe",
                    "algorithms": [
                      "sha256",
                      "sha512"
                    ]
                  }
                },
                "example3": {
                  "summary": "Verify a SHA-256 checksum of a small file",
                  "value": {
                    "file": {
                      "filename": "readme.txt",
                      "contentType": "text/plain",
                      "contentBase64": "dXNlZnVsd2ViLnNpdGUgY2hlY2tzdW0gZGVtbwo="
                    },
                    "algorithms": [
                      "sha256",
                      "sha3-256",
                      "crc32"
                    ],
                    "expected": "CFA892AD DD30FF8C 6453D2F3 B44C88C3 63B38A3F B5113357 39A5067F 555BE6C0"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HashHmacCalculatorResult"
                }
              }
            }
          },
          "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"
                }
              }
            }
          }
        }
      },
      "ObscuriqIndicatorExtractorInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "text": {
            "title": "Text to inspect",
            "description": "Paste text you are authorized to review. No lookups are performed.",
            "type": "string",
            "maxLength": 100000,
            "default": "Suspicious link hxxps://example[.]org/login and analyst@example.org. Host 192.0.2.10 appears twice: 192.0.2.10."
          }
        },
        "required": []
      },
      "ObscuriqIndicatorExtractorResult": {
        "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": [
              "indicators",
              "uniqueCount",
              "occurrenceCount"
            ],
            "properties": {
              "indicators": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "type",
                    "value",
                    "occurrences"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "URL",
                        "Email",
                        "Domain",
                        "IPv4",
                        "Hash",
                        "Bitcoin address",
                        "Ethereum address",
                        "EVM hash"
                      ]
                    },
                    "value": {
                      "type": "string"
                    },
                    "occurrences": {
                      "type": "integer"
                    }
                  }
                }
              },
              "uniqueCount": {
                "type": "integer"
              },
              "occurrenceCount": {
                "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"
              }
            }
          }
        }
      },
      "ObscuriqIocConverterInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "text": {
            "title": "Text to inspect",
            "description": "Paste text you are authorized to review. No lookups are performed.",
            "type": "string",
            "maxLength": 100000,
            "default": "Suspicious link hxxps://example[.]org/login and analyst@example.org. Host 192.0.2.10 appears twice: 192.0.2.10."
          },
          "mode": {
            "title": "Conversion",
            "type": "string",
            "enum": [
              "defang",
              "refang"
            ],
            "default": "defang"
          }
        },
        "required": []
      },
      "ObscuriqIocConverterResult": {
        "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": [
              "output",
              "recognized",
              "changed"
            ],
            "properties": {
              "output": {
                "type": "string"
              },
              "recognized": {
                "type": "integer"
              },
              "changed": {
                "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"
              }
            }
          }
        }
      },
      "ObscuriqUrlCleanerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "url": {
            "title": "URL to inspect",
            "description": "Paste an HTTP or HTTPS URL. No destination is contacted.",
            "type": "string",
            "maxLength": 8000,
            "default": "https://example.org/article?id=42&utm_source=mail&fbclid=abc#details"
          }
        },
        "required": []
      },
      "ObscuriqUrlCleanerResult": {
        "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": [
              "original",
              "cleaned",
              "removed"
            ],
            "properties": {
              "original": {
                "type": "string"
              },
              "cleaned": {
                "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"
              }
            }
          }
        }
      },
      "ObscuriqSearchQueryBuilderInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "subject": {
            "title": "Exact phrase",
            "description": "Enter a phrase without quotation marks.",
            "type": "string",
            "maxLength": 160,
            "default": "example research project"
          },
          "domain": {
            "title": "Restrict one query to this domain (optional)",
            "type": "string",
            "maxLength": 253,
            "default": "example.org"
          },
          "exclude": {
            "title": "Exclude this phrase (optional)",
            "type": "string",
            "maxLength": 160,
            "default": ""
          }
        },
        "required": []
      },
      "ObscuriqSearchQueryBuilderResult": {
        "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": [
              "subject",
              "domain",
              "exclude",
              "queries"
            ],
            "properties": {
              "subject": {
                "type": "string"
              },
              "domain": {
                "type": "string"
              },
              "exclude": {
                "type": "string"
              },
              "queries": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "purpose",
                    "query"
                  ],
                  "properties": {
                    "purpose": {
                      "type": "string"
                    },
                    "query": {
                      "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"
              }
            }
          }
        }
      },
      "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"
              }
            }
          }
        }
      },
      "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"
              }
            }
          }
        }
      },
      "InternetArchiveChangeExplorerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "url": {
            "title": "Page URL",
            "type": "string",
            "format": "uri"
          },
          "beforeDate": {
            "title": "Before date",
            "description": "The capture closest to this date is used. Default: one year ago.",
            "type": "string",
            "format": "date"
          },
          "afterDate": {
            "title": "After date",
            "description": "Default: today (latest capture).",
            "type": "string",
            "format": "date"
          },
          "beforeTimestamp": {
            "title": "Exact \"before\" capture (14-digit timestamp)",
            "type": "string",
            "maxLength": 14
          },
          "afterTimestamp": {
            "title": "Exact \"after\" capture (14-digit timestamp)",
            "type": "string",
            "maxLength": 14
          },
          "maxCaptures": {
            "title": "Captures shown in the timeline",
            "type": "integer",
            "minimum": 5,
            "maximum": 200,
            "default": 40
          },
          "maxChanges": {
            "title": "Max changes listed",
            "type": "integer",
            "minimum": 5,
            "maximum": 200,
            "default": 25
          },
          "pastedCdx": {
            "title": "Pasted CDX output (offline)",
            "description": "output=json rows or default text lines.",
            "type": "string",
            "maxLength": 2000000
          },
          "pastedBefore": {
            "title": "Pasted \"before\" HTML (offline)",
            "type": "string",
            "maxLength": 400000
          },
          "pastedAfter": {
            "title": "Pasted \"after\" HTML (offline)",
            "type": "string",
            "maxLength": 400000
          }
        },
        "required": []
      },
      "InternetArchiveChangeExplorerResult": {
        "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",
              "before",
              "after",
              "captures",
              "identical",
              "comparison",
              "highlights",
              "unifiedDiff"
            ],
            "properties": {
              "url": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "before": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "timestamp",
                  "time",
                  "original",
                  "digest",
                  "archiveUrl",
                  "rawUrl",
                  "selectedBy"
                ],
                "properties": {
                  "timestamp": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "time": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "original": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "digest": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "archiveUrl": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "rawUrl": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "selectedBy": {
                    "type": "string",
                    "enum": [
                      "nearest-capture",
                      "explicit-timestamp",
                      "pasted"
                    ]
                  }
                }
              },
              "after": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "timestamp",
                  "time",
                  "original",
                  "digest",
                  "archiveUrl",
                  "rawUrl",
                  "selectedBy"
                ],
                "properties": {
                  "timestamp": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "time": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "original": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "digest": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "archiveUrl": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "rawUrl": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "selectedBy": {
                    "type": "string",
                    "enum": [
                      "nearest-capture",
                      "explicit-timestamp",
                      "pasted"
                    ]
                  }
                }
              },
              "captures": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "total",
                  "distinctVersions",
                  "granularity",
                  "items"
                ],
                "properties": {
                  "total": {
                    "type": "integer"
                  },
                  "distinctVersions": {
                    "type": "integer"
                  },
                  "granularity": {
                    "type": "string"
                  },
                  "items": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "timestamp",
                        "time",
                        "original",
                        "statuscode",
                        "digest",
                        "length",
                        "newVersion"
                      ],
                      "properties": {
                        "timestamp": {
                          "type": "string"
                        },
                        "time": {
                          "type": "string"
                        },
                        "original": {
                          "type": "string"
                        },
                        "statuscode": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "digest": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "length": {
                          "type": [
                            "integer",
                            "null"
                          ]
                        },
                        "newVersion": {
                          "type": "boolean"
                        }
                      }
                    }
                  }
                }
              },
              "identical": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "true when both captures have the same content digest (no fetch needed)."
              },
              "comparison": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "similarityPct",
                  "wordsBefore",
                  "wordsAfter",
                  "meaningful",
                  "trivial",
                  "high",
                  "medium",
                  "low"
                ],
                "properties": {
                  "similarityPct": {
                    "type": "number"
                  },
                  "wordsBefore": {
                    "type": "integer"
                  },
                  "wordsAfter": {
                    "type": "integer"
                  },
                  "meaningful": {
                    "type": "integer"
                  },
                  "trivial": {
                    "type": "integer"
                  },
                  "high": {
                    "type": "integer"
                  },
                  "medium": {
                    "type": "integer"
                  },
                  "low": {
                    "type": "integer"
                  }
                }
              },
              "highlights": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "category",
                    "level",
                    "kind",
                    "element",
                    "before",
                    "after",
                    "wordDiff"
                  ],
                  "properties": {
                    "category": {
                      "type": "string"
                    },
                    "level": {
                      "type": "string"
                    },
                    "kind": {
                      "type": "string"
                    },
                    "element": {
                      "type": "string"
                    },
                    "before": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "after": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "wordDiff": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                }
              },
              "unifiedDiff": {
                "type": [
                  "string",
                  "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"
              }
            }
          }
        }
      },
      "TransactionDecoderInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "mode": {
            "title": "What do you have?",
            "type": "string",
            "enum": [
              "lookup",
              "calldata"
            ],
            "default": "lookup"
          },
          "chain": {
            "title": "Chain",
            "type": "string",
            "enum": [
              "ethereum",
              "base",
              "arbitrum",
              "optimism",
              "polygon",
              "avalanche",
              "bsc"
            ],
            "default": "ethereum"
          },
          "txHash": {
            "title": "Transaction hash",
            "type": "string",
            "maxLength": 66
          },
          "calldata": {
            "title": "Calldata (input data)",
            "type": "string",
            "maxLength": 200000
          },
          "signature": {
            "title": "Function signature (optional)",
            "type": "string",
            "maxLength": 500
          },
          "abi": {
            "title": "Contract ABI JSON (optional)",
            "type": "string",
            "maxLength": 500000
          }
        },
        "required": []
      },
      "TransactionDecoderResult": {
        "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",
              "chain",
              "transaction",
              "call",
              "logs",
              "tokenTransfers",
              "graph"
            ],
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "lookup",
                  "calldata"
                ]
              },
              "chain": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "id",
                  "name",
                  "chainId"
                ],
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  },
                  "chainId": {
                    "type": "integer"
                  }
                }
              },
              "transaction": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "hash",
                  "status",
                  "finality",
                  "blockNumber",
                  "timestamp",
                  "confirmations",
                  "from",
                  "to",
                  "contractCreated",
                  "valueWei",
                  "value",
                  "gasUsed",
                  "effectiveGasPriceWei",
                  "feeWei",
                  "fee",
                  "nonce",
                  "type"
                ],
                "properties": {
                  "hash": {
                    "type": "string"
                  },
                  "status": {
                    "type": "string",
                    "enum": [
                      "success",
                      "reverted",
                      "pending"
                    ]
                  },
                  "finality": {
                    "type": "string",
                    "enum": [
                      "pending",
                      "unfinalized",
                      "finalized",
                      "unknown"
                    ]
                  },
                  "blockNumber": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "timestamp": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "confirmations": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "from": {
                    "type": "string"
                  },
                  "to": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "contractCreated": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "valueWei": {
                    "type": "string"
                  },
                  "value": {
                    "type": "string"
                  },
                  "gasUsed": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "effectiveGasPriceWei": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "feeWei": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "fee": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "nonce": {
                    "type": "integer"
                  },
                  "type": {
                    "type": "integer"
                  }
                }
              },
              "call": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "selector",
                  "signature",
                  "signatureSource",
                  "args",
                  "alternatives"
                ],
                "properties": {
                  "selector": {
                    "type": "string"
                  },
                  "signature": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "signatureSource": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "alternatives": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "args": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "name",
                        "type",
                        "value"
                      ],
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "type": {
                          "type": "string"
                        },
                        "value": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              },
              "logs": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "index",
                    "address",
                    "topic0",
                    "event",
                    "eventSource",
                    "indexingAssumed",
                    "args"
                  ],
                  "properties": {
                    "index": {
                      "type": "integer"
                    },
                    "address": {
                      "type": "string"
                    },
                    "topic0": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "event": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "eventSource": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "indexingAssumed": {
                      "type": "boolean"
                    },
                    "args": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "name",
                          "type",
                          "indexed",
                          "value"
                        ],
                        "properties": {
                          "name": {
                            "type": "string"
                          },
                          "type": {
                            "type": "string"
                          },
                          "indexed": {
                            "type": "boolean"
                          },
                          "value": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }
              },
              "tokenTransfers": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "token",
                    "symbol",
                    "from",
                    "to",
                    "raw",
                    "amount"
                  ],
                  "properties": {
                    "token": {
                      "type": "string"
                    },
                    "symbol": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "from": {
                      "type": "string"
                    },
                    "to": {
                      "type": "string"
                    },
                    "raw": {
                      "type": "string"
                    },
                    "amount": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                }
              },
              "graph": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "nodes",
                  "edges"
                ],
                "properties": {
                  "nodes": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "id",
                        "kind",
                        "label"
                      ],
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "kind": {
                          "type": "string"
                        },
                        "label": {
                          "type": "string"
                        }
                      }
                    }
                  },
                  "edges": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "from",
                        "to",
                        "relation"
                      ],
                      "properties": {
                        "from": {
                          "type": "string"
                        },
                        "to": {
                          "type": "string"
                        },
                        "relation": {
                          "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"
              }
            }
          }
        }
      },
      "UnicodeInspectorInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "text": {
            "title": "Text",
            "description": "Up to 20,000 characters; the table lists the first 500 code points.",
            "type": "string",
            "maxLength": 20000
          }
        },
        "required": [
          "text"
        ]
      },
      "UnicodeInspectorResult": {
        "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": [
              "codePoints",
              "utf16Units",
              "utf8Bytes",
              "graphemes",
              "truncated",
              "chars",
              "scripts",
              "normalization",
              "findings",
              "skeleton",
              "escaped"
            ],
            "properties": {
              "codePoints": {
                "type": "integer"
              },
              "utf16Units": {
                "type": "integer",
                "description": "JavaScript string length."
              },
              "utf8Bytes": {
                "type": "integer"
              },
              "graphemes": {
                "type": "integer",
                "description": "User-perceived characters (extended grapheme clusters)."
              },
              "truncated": {
                "type": "boolean",
                "description": "true when more than 500 code points; chars then lists the first 500."
              },
              "chars": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "index",
                    "codePoint",
                    "char",
                    "name",
                    "category",
                    "categoryName",
                    "script",
                    "utf8",
                    "utf16",
                    "flags"
                  ],
                  "properties": {
                    "index": {
                      "type": "integer"
                    },
                    "codePoint": {
                      "type": "string"
                    },
                    "char": {
                      "type": "string"
                    },
                    "name": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "category": {
                      "type": "string"
                    },
                    "categoryName": {
                      "type": "string"
                    },
                    "script": {
                      "type": "string"
                    },
                    "utf8": {
                      "type": "string"
                    },
                    "utf16": {
                      "type": "string"
                    },
                    "flags": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              },
              "scripts": {
                "type": "object",
                "additionalProperties": {
                  "type": "integer"
                }
              },
              "normalization": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "form",
                    "equal",
                    "codePoints",
                    "utf8Bytes",
                    "text"
                  ],
                  "properties": {
                    "form": {
                      "type": "string"
                    },
                    "equal": {
                      "type": "boolean"
                    },
                    "codePoints": {
                      "type": "integer"
                    },
                    "utf8Bytes": {
                      "type": "integer"
                    },
                    "text": {
                      "type": "string"
                    }
                  }
                }
              },
              "findings": {
                "type": "object",
                "additionalProperties": true
              },
              "skeleton": {
                "type": "string",
                "description": "NFKC + Latin look-alike mapping, for comparing against an expected string."
              },
              "escaped": {
                "type": "string",
                "description": "The input with invisible/bidi/control characters as \\u{…} escapes."
              }
            }
          },
          "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"
              }
            }
          }
        }
      },
      "ExifInspectorCleanerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "file": {
            "title": "Photo",
            "description": "JPG, PNG, WebP, TIFF, HEIC, AVIF or GIF (RAW files can be inspected but not cleaned), max 50 MB. Upload as {filename, contentType?, contentBase64}. Max 51200 KiB. Accepts .jpg,.jpeg,.png,.webp,.tif,.tiff,.heic,.heif,.avif,.gif,.dng,.cr2,.cr3,.nef,.arw,.orf,.rw2,.raf,image/*.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "action": {
            "title": "What to do",
            "type": "string",
            "enum": [
              "all",
              "gps",
              "keep-essential",
              "inspect"
            ],
            "default": "all"
          }
        },
        "required": [
          "file"
        ]
      },
      "ExifInspectorCleanerResult": {
        "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": [
              "fileType",
              "tagCount",
              "groups",
              "tags",
              "tagsTruncated",
              "gps",
              "privacyTags",
              "action",
              "cleaned"
            ],
            "properties": {
              "fileType": {
                "type": "string"
              },
              "tagCount": {
                "type": "integer",
                "description": "Metadata tags in EXIF, GPS, XMP, IPTC and MakerNotes."
              },
              "groups": {
                "type": "object",
                "additionalProperties": {
                  "type": "integer"
                }
              },
              "tags": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "group",
                    "source",
                    "tag",
                    "value"
                  ],
                  "properties": {
                    "group": {
                      "type": "string",
                      "enum": [
                        "GPS",
                        "EXIF",
                        "XMP",
                        "IPTC",
                        "MakerNotes",
                        "ICC_Profile",
                        "File",
                        "Other"
                      ]
                    },
                    "source": {
                      "type": "string"
                    },
                    "tag": {
                      "type": "string"
                    },
                    "value": {
                      "type": "string"
                    }
                  }
                }
              },
              "tagsTruncated": {
                "type": "boolean"
              },
              "gps": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "latitude",
                  "longitude",
                  "altitude"
                ],
                "properties": {
                  "latitude": {
                    "type": "number"
                  },
                  "longitude": {
                    "type": "number"
                  },
                  "altitude": {
                    "type": [
                      "number",
                      "null"
                    ]
                  }
                }
              },
              "privacyTags": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "action": {
                "type": "string",
                "enum": [
                  "inspect",
                  "all",
                  "gps",
                  "keep-essential"
                ]
              },
              "cleaned": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "artifact",
                  "remainingTags",
                  "remainingGroups",
                  "gpsRemaining",
                  "pixelsUnchanged",
                  "verified"
                ],
                "properties": {
                  "artifact": {
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "artifactId",
                      "filename",
                      "mime",
                      "bytes",
                      "sha256",
                      "path"
                    ],
                    "properties": {
                      "artifactId": {
                        "type": "string"
                      },
                      "filename": {
                        "type": "string"
                      },
                      "mime": {
                        "type": "string"
                      },
                      "bytes": {
                        "type": "integer"
                      },
                      "sha256": {
                        "type": "string"
                      },
                      "path": {
                        "type": "string",
                        "description": "Download path on the same site (valid for about 2 hours)."
                      }
                    }
                  },
                  "remainingTags": {
                    "type": "integer"
                  },
                  "remainingGroups": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "integer"
                    }
                  },
                  "gpsRemaining": {
                    "type": "integer"
                  },
                  "pixelsUnchanged": {
                    "type": [
                      "boolean",
                      "null"
                    ],
                    "description": "Decoded pixel hash equal before/after (null when not checked)."
                  },
                  "verified": {
                    "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"
              }
            }
          }
        }
      },
      "HashHmacCalculatorInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "text": {
            "title": "Text",
            "description": "Hashed exactly as entered (no trailing newline is added). Leave empty when you choose a file.",
            "type": "string",
            "maxLength": 1000000
          },
          "textFormat": {
            "title": "Text is",
            "type": "string",
            "enum": [
              "utf8",
              "hex",
              "base64"
            ],
            "default": "utf8"
          },
          "file": {
            "title": "Or a file",
            "description": "Any file up to 100 MB. With JavaScript on it is hashed in your browser and never uploaded. Upload as {filename, contentType?, contentBase64}. Max 102400 KiB. Accepts */*.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "algorithms": {
            "title": "Algorithms",
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "md5",
                "sha1",
                "sha224",
                "sha256",
                "sha384",
                "sha512",
                "sha3-256",
                "sha3-512",
                "blake2b512",
                "blake2s256",
                "crc32"
              ]
            },
            "default": [
              "md5",
              "sha1",
              "sha256",
              "sha512",
              "sha3-256",
              "blake2b512",
              "crc32"
            ]
          },
          "hmacKey": {
            "title": "HMAC key (optional)",
            "description": "With a key, an HMAC (RFC 2104) is computed instead of a plain hash.",
            "type": "string",
            "maxLength": 4096
          },
          "hmacKeyFormat": {
            "title": "Key is",
            "type": "string",
            "enum": [
              "utf8",
              "hex",
              "base64"
            ],
            "default": "utf8"
          },
          "outputEncoding": {
            "title": "Output",
            "type": "string",
            "enum": [
              "hex",
              "base64"
            ],
            "default": "hex"
          },
          "expected": {
            "title": "Expected hash to compare (optional)",
            "description": "Paste a published checksum (hex or Base64); it is compared with every computed value.",
            "type": "string",
            "maxLength": 300
          }
        },
        "required": []
      },
      "HashHmacCalculatorResult": {
        "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": [
              "source",
              "inputBytes",
              "mode",
              "encoding",
              "digests",
              "comparison"
            ],
            "properties": {
              "source": {
                "type": "string",
                "enum": [
                  "text",
                  "file"
                ]
              },
              "filename": {
                "type": "string"
              },
              "inputBytes": {
                "type": "integer"
              },
              "mode": {
                "type": "string",
                "enum": [
                  "hash",
                  "hmac"
                ]
              },
              "encoding": {
                "type": "string",
                "enum": [
                  "hex",
                  "base64"
                ]
              },
              "digests": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "algorithm",
                    "label",
                    "bits",
                    "hex",
                    "base64",
                    "note"
                  ],
                  "properties": {
                    "algorithm": {
                      "type": "string"
                    },
                    "label": {
                      "type": "string"
                    },
                    "bits": {
                      "type": "integer"
                    },
                    "hex": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "base64": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "note": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                }
              },
              "comparison": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "expected",
                  "format",
                  "matched"
                ],
                "properties": {
                  "expected": {
                    "type": "string"
                  },
                  "format": {
                    "type": "string"
                  },
                  "matched": {
                    "type": [
                      "string",
                      "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"
              }
            }
          }
        }
      }
    }
  }
}