{
  "openapi": "3.1.1",
  "info": {
    "title": "Developer & data tools 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://developer.usefulweb.app"
    }
  ],
  "paths": {
    "/api/v1/tools": {
      "get": {
        "operationId": "listTools",
        "summary": "Catalog of all tools",
        "responses": {
          "200": {
            "description": "Tool list.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/{id}": {
      "get": {
        "operationId": "getTool",
        "summary": "Definition of one tool",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "headerlens",
                "a11y-snapshot",
                "browser-compatibility-checker",
                "citeshape",
                "cyberchef-lite-pipeline",
                "datafresh",
                "filefit",
                "localekit",
                "network-speed-tester",
                "ruledate",
                "safe-markdown-preview",
                "timefair",
                "unicode-inspector",
                "unitproof",
                "unix-permission-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/headerlens/calculate": {
      "post": {
        "operationId": "calculateHeaderlens",
        "summary": "Is a website down? Multi-region status, redirects, TLS and security headers.",
        "description": "Checks a public website from every configured probe region at once, separates \"down\" from \"up but blocking bots\", and explains redirects, TLS and security/caching headers in plain English.\n\nMethodology:\n- Each check probes https://host/ (falling back to http) from every configured region in parallel; each region produces its own observation.\n- Per region: DNS → TLS → bounded GET with up to 5 re-validated redirects; 401/403/429/challenge pages are \"reachable_restricted\", not \"down\".\n- Consensus: unanimous / majority / partial_outage (some regions down, others up → degraded) / no_conclusive_data.\n- Only public addresses are ever contacted (SSRF-safe: re-validated at connect time and on every redirect).",
        "tags": [
          "developer"
        ],
        "x-mcp-tool": "headerlens",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HeaderlensInput"
              },
              "examples": {
                "example1": {
                  "summary": "example.com",
                  "value": {
                    "target": "example.com"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HeaderlensResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/a11y-snapshot/calculate": {
      "post": {
        "operationId": "calculateA11ySnapshot",
        "summary": "Static WCAG 2.2 snapshot of a page: findings by severity, evidence and manual checks.",
        "description": "Fetch a public URL or paste HTML to get a deterministic accessibility snapshot: page language, title, image alternatives, form labels, button and link names, heading outline, landmarks, tables, iframes, zoom blocking and more — each finding mapped to a WCAG 2.2 success criterion with the offending element. It also lists what must be checked by hand.\n\nMethodology:\n- The HTML is parsed by a tolerant tokenizer/tree builder; no JavaScript is executed and no CSS is computed, so content injected by scripts is not seen.\n- 28 rules run: language, title, text alternatives, form labels, button/link names, headings, duplicate ids, viewport zoom, data tables, iframe titles, autoplaying media, landmarks, skip link, tabindex and aria-hidden misuse.\n- Each finding is classed as \"failure\" (strong evidence of a WCAG 2.2 success-criterion failure), \"best-practice\" (recommended but not a strict failure, e.g. heading order or duplicate ids — SC 4.1.1 Parsing is obsolete in WCAG 2.2) or \"needs-review\".\n- Accessible names are approximated from aria-labelledby, aria-label, label elements, content text, image alt and title, in that order.\n- Criteria that need rendering or human judgement (colour, contrast, keyboard, focus visibility, captions…) are listed as manual checks.\n\nAutomated static checks can only detect some failures. They cannot establish WCAG 2.2 conformance: conformance requires a full manual review of every page state (WCAG 2.2 §5.2), including rendered contrast, keyboard operation and assistive-technology testing.",
        "tags": [
          "developer"
        ],
        "x-mcp-tool": "a11y_snapshot",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/A11ySnapshotInput"
              },
              "examples": {
                "example1": {
                  "summary": "Landing page with common problems",
                  "value": {
                    "html": "<!doctype html>\n<html>\n<head><meta name=\"viewport\" content=\"width=device-width, user-scalable=no\"><title></title></head>\n<body>\n<div class=\"nav\"><a href=\"/\"><img src=\"logo.png\"></a> <a href=\"/shop\">Shop</a> <a href=\"/blog\">Blog</a> <a href=\"/help\">Help</a> <a href=\"/about\">About</a> <a href=\"/cart\"><svg aria-hidden=\"true\"></svg></a></div>\n<h1>Spring sale</h1>\n<h3>Newsletter</h3>\n<form><input type=\"email\" name=\"email\" placeholder=\"Your email\"><button><svg aria-hidden=\"true\"></svg></button></form>\n<p>Read our offers <a href=\"/offers\">click here</a>.</p>\n<iframe src=\"https://www.youtube.com/embed/xyz\"></iframe>\n</body>\n</html>",
                    "maxFindings": 100
                  }
                },
                "example2": {
                  "summary": "Well-structured contact page",
                  "value": {
                    "html": "<!doctype html>\n<html lang=\"en\">\n<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><title>Contact – Example Ltd</title></head>\n<body>\n<a class=\"skip-link\" href=\"#main\">Skip to main content</a>\n<header><nav aria-label=\"Main\"><a href=\"/\">Home</a> <a href=\"/products\">Products</a> <a href=\"/pricing\">Pricing</a> <a href=\"/support\">Support</a> <a href=\"/contact\">Contact</a></nav></header>\n<main id=\"main\">\n<h1>Contact us</h1>\n<form><label for=\"name\">Name</label><input id=\"name\" name=\"name\" autocomplete=\"name\"><label for=\"msg\">Message</label><textarea id=\"msg\" name=\"msg\"></textarea><button type=\"submit\">Send</button></form>\n<img src=\"/team.jpg\" alt=\"Our support team in the Berlin office\">\n</main>\n</body>\n</html>",
                    "maxFindings": 50
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/A11ySnapshotResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/browser-compatibility-checker/calculate": {
      "post": {
        "operationId": "calculateBrowserCompatibilityChecker",
        "summary": "Which browsers support a CSS property, JS API or HTML element? MDN data + Baseline status.",
        "description": "Look up a web platform feature by its MDN browser-compat-data key (css.properties.container, api.Navigator.share) or by free text (container queries, dialog, structuredClone) and get the first supporting version per browser, flags/prefix/partial notes, the current browser versions and the Baseline status from web-features.\n\nMethodology:\n- Data: the published @mdn/browser-compat-data package (data.json from unpkg), pruned to one record per feature and cached for 7 days. Baseline status comes from the web-features package (status.by_compat_key). If the download fails, a bundled subset of the same data is used and the result says so.\n- An exact BCD key is looked up directly; otherwise every word must appear in the key, the description or the Baseline feature name. Shallower keys and whole-segment matches rank first.\n- Each cell is BCD's first (main) support statement: the version that added the feature, \"No\", or notes for partial support, prefixes, alternative names, flags and removal. Other statements (e.g. older prefixed versions) are summarised in BCD itself, linked via MDN.\n- Baseline: \"widely available\" = supported in Chrome, Edge, Firefox and Safari (desktop and mobile) for 30 months; \"newly available\" = supported in all of them; otherwise \"limited availability\".",
        "tags": [
          "developer"
        ],
        "x-mcp-tool": "browser_compatibility_checker",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BrowserCompatibilityCheckerInput"
              },
              "examples": {
                "example1": {
                  "summary": "CSS container property",
                  "value": {
                    "query": "css.properties.container",
                    "source": "bundled"
                  }
                },
                "example2": {
                  "summary": "Web Share API (navigator.share)",
                  "value": {
                    "query": "api.Navigator.share",
                    "source": "bundled"
                  }
                },
                "example3": {
                  "summary": "Search \"dialog\"",
                  "value": {
                    "query": "dialog",
                    "source": "bundled",
                    "maxResults": 8
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrowserCompatibilityCheckerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/citeshape/calculate": {
      "post": {
        "operationId": "calculateCiteshape",
        "summary": "Paste a DOI, ORCID iD, ISBN or arXiv ID: validated, resolved, and formatted as APA, BibTeX and RIS.",
        "description": "CiteShape finds the identifier in whatever you paste (URL, \"doi:\", reference text), normalises it, validates check digits (ORCID ISO 7064, ISBN-10/13), resolves authoritative metadata from Crossref, ORCID and arXiv, and emits APA-style, BibTeX and RIS citations. Retrieved facts are kept separate from your input, and nothing missing is guessed.\n\nMethodology:\n- Detection order: DOI (10.prefix/suffix, also in doi.org URLs) → ORCID iD → arXiv ID → ISBN. DOIs are lower-cased (DOIs are case-insensitive).\n- ORCID: ISO 7064 MOD 11-2 check digit. ISBN-10: weighted sum mod 11; ISBN-13: alternating 1/3 weights mod 10. ISBN-10 is converted to ISBN-13 with prefix 978.\n- Resolution: DOI → api.crossref.org/works/{doi}; ORCID → pub.orcid.org/v3.0/{id}/record (JSON); arXiv → export.arxiv.org/api/query. ISBN metadata is not resolved (no open authoritative registry).\n- Citations are generated only from retrieved metadata; APA output follows APA 7 reference structure for author list, year, title, container, volume(issue), pages and DOI link.",
        "tags": [
          "developer"
        ],
        "x-mcp-tool": "citeshape",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CiteshapeInput"
              },
              "examples": {
                "example1": {
                  "summary": "ORCID check digit (offline)",
                  "value": {
                    "identifier": "https://orcid.org/0000-0002-1825-0097",
                    "resolve": false
                  }
                },
                "example2": {
                  "summary": "ISBN-10 → ISBN-13 (offline)",
                  "value": {
                    "identifier": "ISBN 0-306-40615-2",
                    "resolve": false
                  }
                },
                "example3": {
                  "summary": "Invalid ORCID (offline)",
                  "value": {
                    "identifier": "0000-0002-1825-0098",
                    "resolve": false
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CiteshapeResult"
                }
              }
            }
          },
          "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/cyberchef-lite-pipeline/calculate": {
      "post": {
        "operationId": "calculateCyberchefLitePipeline",
        "summary": "One-click decoding recipes: JWT, base64 → gunzip → JSON, double URL decode, hex dump.",
        "description": "A simple front end for common data transformations: pick a ready recipe such as “decode a JWT”, “base64 → gunzip → pretty JSON”, “URL decode twice” or “hex dump”, or chain up to five steps from a short list. Shows every intermediate result. Uses the same engine as Crypto Kitchen, which offers all operations and arguments.\n\nMethodology:\n- Each preset is a fixed list of Crypto Kitchen operations; “Custom” runs up to five steps chosen from a curated list with default arguments.\n- The engine and its safety limits (50 MB decompression limit, 10 MB input) are shared with Crypto Kitchen; the equivalent recipe text is shown so you can continue there with more operations and arguments.\n- JWT decoding never verifies the signature; use Crypto Kitchen’s jwt-verify with the key for that.",
        "tags": [
          "developer"
        ],
        "x-mcp-tool": "cyberchef_lite_pipeline",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CyberchefLitePipelineInput"
              },
              "examples": {
                "example1": {
                  "summary": "Decode a JWT",
                  "value": {
                    "input": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c",
                    "preset": "jwt-decode"
                  }
                },
                "example2": {
                  "summary": "Base64 → gunzip → pretty JSON",
                  "value": {
                    "input": "H4sIAAAAAAACA6tWKi1OLVKyUkpMSVTSUSrKz0ktVrKKVkpMyc3MU9JRSkktU4rVUUpMLsksS1WyKikqTa0FAJsiBuU0AAAA",
                    "preset": "base64-gunzip-json"
                  }
                },
                "example3": {
                  "summary": "URL decode twice",
                  "value": {
                    "input": "name%3DJ%25C3%25BCrgen%2520M%25C3%25BCller%26city%3DK%25C3%25B6ln",
                    "preset": "url-decode-twice"
                  }
                },
                "example4": {
                  "summary": "Hex dump",
                  "value": {
                    "input": "Hello, usefulweb!\n",
                    "preset": "hex-dump"
                  }
                },
                "example5": {
                  "summary": "Custom: base64 decode, then SHA-256",
                  "value": {
                    "input": "aGVsbG8gd29ybGQ=",
                    "preset": "custom",
                    "step1": "from-base64",
                    "step2": "hash-sha256"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CyberchefLitePipelineResult"
                }
              }
            }
          },
          "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/datafresh/calculate": {
      "post": {
        "operationId": "calculateDatafresh",
        "summary": "Is this dataset or API still fresh? Newest record, update cadence check and schema drift.",
        "description": "Point DataFresh at a public JSON or CSV endpoint (or paste the content). It finds the records, infers a schema with a stable fingerprint, finds the newest timestamp, compares its age with the update cadence you expect, and reports schema changes since the last check – as one of: healthy, stale, schema_changed, unavailable, no_timestamp.\n\nMethodology:\n- Records: a JSON root array, or the largest array of objects within 3 levels; CSV uses the first row as header (comma or semicolon).\n- Schema: every field (one nesting level flattened as parent.child) with its observed value types and presence ratio; the fingerprint is the first 16 hex chars of SHA-256 over sorted \"field:types\" lines.\n- Timestamp: the field you name, otherwise the first field named like updated/modified/timestamp/date/time/year where ≥ 80% of values parse as dates (ISO 8601, epoch s/ms, YYYY, YYYY-Qn, DD.MM.YYYY). Years count as 31 Dec, quarters as their last day.\n- Freshness: age = now − newest timestamp. healthy if age ≤ 1.5 × expected interval, otherwise stale. Without a timestamp field the HTTP Last-Modified header is used if present.\n- Drift: compared with the previous schema you paste or, with \"remember\", the schema stored for the same URL (key = SHA-256 of the URL). Any added/removed field or type change → schema_changed (takes precedence over healthy, not over unavailable).",
        "tags": [
          "developer"
        ],
        "x-mcp-tool": "datafresh",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DatafreshInput"
              },
              "examples": {
                "example1": {
                  "summary": "Stale daily feed",
                  "value": {
                    "content": "{\"meta\":{\"source\":\"example\"},\"items\":[{\"id\":1,\"value\":3.2,\"updated_at\":\"2026-10-01T06:00:00Z\"},{\"id\":2,\"value\":4.1,\"updated_at\":\"2026-10-03T06:00:00Z\"}]}",
                    "expectedCadenceHours": 24
                  }
                },
                "example2": {
                  "summary": "Yearly CSV with schema change",
                  "value": {
                    "content": "country;year;value\nDE;2024;2.5\nFR;2025;2.1",
                    "expectedCadenceHours": 8760,
                    "previousSchema": "{\"country\":{\"types\":[\"string\"],\"presence\":1},\"year\":{\"types\":[\"number\"],\"presence\":1},\"value\":{\"types\":[\"number\"],\"presence\":1},\"unit\":{\"types\":[\"string\"],\"presence\":1}}"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DatafreshResult"
                }
              }
            }
          },
          "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/filefit/calculate": {
      "post": {
        "operationId": "calculateFilefit",
        "summary": "Can this app open, edit or convert that file format? Verified facts with sources.",
        "description": "A compatibility graph of common document, image, video and audio formats against office apps, browsers, operating-system viewers and conversion tools. Every fact links to the vendor or caniuse source it was taken from, with its verification date; conversion paths are found by graph search.\n\nMethodology:\n- Facts come only from the cited vendor documentation or the caniuse dataset, transcribed on the verification date; \"not-listed\" means absent from the vendor list, not proven unsupported.\n- Capabilities = all facts for the chosen format, filtered by application and operation.\n- Conversion: an app that can open/read format A and export/write format B creates an edge A→B; the shortest path is found by breadth-first search; among equally short paths the one with fewer partial-support facts and documented caveats wins.",
        "tags": [
          "developer"
        ],
        "x-mcp-tool": "filefit",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FilefitInput"
              },
              "examples": {
                "example1": {
                  "summary": "HEIC photos everywhere",
                  "value": {
                    "format": "heic",
                    "target": "any",
                    "operation": "any"
                  }
                },
                "example2": {
                  "summary": "Pages → Word",
                  "value": {
                    "format": "pages",
                    "target": "fmt:docx",
                    "operation": "convert"
                  }
                },
                "example3": {
                  "summary": "ODT in Microsoft Word",
                  "value": {
                    "format": "odt",
                    "target": "app:word",
                    "operation": "any"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FilefitResult"
                }
              }
            }
          },
          "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/localekit/calculate": {
      "post": {
        "operationId": "calculateLocalekit",
        "summary": "Address form fields, postal-code regex, calling code and date formats for any country.",
        "description": "Pick a country to get its address form as an ordered field schema (with required flags and local labels like PIN code or Prefecture), the postal-code pattern with examples and validation, the calling code with basic E.164 normalisation, and date/number formatting examples for the country’s likely locale.\n\nMethodology:\n- Address rules come from Google’s Address Data Service (the libaddressinput metadata used by Chromium and Android): fmt gives field order and line breaks (%N name, %O organisation, %A street, %D dependent locality, %C city, %S state/province, %Z postal code, %X sorting code), require/upper list required and upper-cased fields; missing keys fall back to the ZZ defaults.\n- Field labels use the country’s zip/state/locality/sublocality name types (e.g. PIN code, Eircode, Prefecture). Tokens not documented in the public metadata (e.g. %T, %F, %L for India) are reported as unmapped rather than guessed.\n- Postal-code validation trims, upper-cases and collapses whitespace, then tests the full string against the anchored data pattern ^(?:zip)$.\n- Phone: calling code, international and national (trunk) prefixes and possible lengths come from libphonenumber’s PhoneNumberMetadata.xml. Normalisation removes punctuation, handles \"+\" or the international prefix, otherwise strips the trunk prefix only if libphonenumber defines one (so Italy keeps its leading 0) and prepends the calling code. This is basic: carrier codes, national-prefix-for-parsing rules and number-type validation are not applied.\n- Locale: the country’s likely locale is derived with Intl.Locale(\"und-CC\").maximize() (CLDR likely subtags) and used with Intl.DateTimeFormat/NumberFormat on the fixed date 2026-12-31 13:45 UTC so day/month order is unambiguous.\n\nAddress and phone metadata change; always accept free-form input as a fallback and never reject an order solely because a postal code or phone number fails a pattern.",
        "tags": [
          "developer"
        ],
        "x-mcp-tool": "localekit",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LocalekitInput"
              },
              "examples": {
                "example1": {
                  "summary": "Germany: postal code + phone",
                  "value": {
                    "country": "DE",
                    "postalCode": "10115",
                    "phone": "030 901820"
                  }
                },
                "example2": {
                  "summary": "India: PIN code and state field",
                  "value": {
                    "country": "IN",
                    "postalCode": "110001",
                    "phone": "+91 98765 43210"
                  }
                },
                "example3": {
                  "summary": "Japan: big-to-small address order",
                  "value": {
                    "country": "JP",
                    "postalCode": "154-0023"
                  }
                },
                "example4": {
                  "summary": "United Kingdom: invalid postcode",
                  "value": {
                    "country": "GB",
                    "postalCode": "SW1A 1AAA",
                    "phone": "020 7946 0018"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LocalekitResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/network-speed-tester/calculate": {
      "post": {
        "operationId": "calculateNetworkSpeedTester",
        "summary": "Measure latency, jitter, download and upload speed between your browser and our server.",
        "description": "Runs in your browser: a series of small requests measures latency and jitter, then a random, incompressible download and an upload measure throughput to this server. Without JavaScript you can enter your own measurements (bytes and milliseconds) and get the same statistics.\n\nMethodology:\n- Latency: the browser sends about 20 tiny no-store requests to /speedtest/ping one after another and times each round trip (the first, which may include connection setup, is discarded). Jitter is the mean absolute difference between consecutive samples.\n- Download: random bytes from /speedtest/download in growing sizes (up to 50 MB) until one transfer takes about 2 seconds; speed = bytes × 8 ÷ time, in megabits per second (10^6 bit/s). The payload is random, so compression cannot inflate the result.\n- Upload: random bytes generated in the browser are POSTed to /speedtest/upload, which discards them and reports how many arrived.\n- Everything runs between your browser and this one server in one region; results to other servers, CDNs or regions can differ a lot. Wi-Fi, VPNs, browser extensions and other traffic on your connection all affect the numbers.\n\nMeasures only the path between your device and our server (single region). Not an official broadband measurement.",
        "tags": [
          "developer"
        ],
        "x-mcp-tool": "network_speed_tester",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NetworkSpeedTesterInput"
              },
              "examples": {
                "example1": {
                  "summary": "Example measurements (fibre-like)",
                  "value": {
                    "pingSamples": "18.2, 17.9, 19.4, 18.1, 25.6, 18.0, 18.3, 17.8, 19.0, 18.4",
                    "downloadBytes": 50000000,
                    "downloadMs": 1420,
                    "uploadBytes": 20000000,
                    "uploadMs": 3350
                  }
                },
                "example2": {
                  "summary": "No measurements yet (explains the test)",
                  "value": {}
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NetworkSpeedTesterResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ruledate/calculate": {
      "post": {
        "operationId": "calculateRuledate",
        "summary": "Business-day and deadline maths with public holidays and a step-by-step rule trace.",
        "description": "Chain date operations (add business days, add months with clamping, end of month, roll to next business day) on a start date. RuleDate uses public holidays for 16 countries and their subdivisions (2024–2030) and shows every skipped date with its reason, so the result can be checked rather than trusted.\n\nMethodology:\n- A business day is a day that is not a selected weekend day, not a public holiday of the chosen country (nationwide, or of the chosen subdivision) and not an extra closure date. Only Nager.Date entries of type \"Public\" count; bank, school, optional and observance days are ignored.\n- Add business days counts business days after the start date (the start date itself is not counted); negative amounts count backwards. Every non-business day passed over is listed with all its reasons.\n- Add calendar days / weeks ignore holidays. Add months keeps the day of month; if it does not exist, \"clamp\" uses the month’s last day and \"overflow\" rolls into the next month.\n- End of month moves to the last calendar day of the month that is `amount` months after the current date. Next / previous business day roll only if the current date is not a business day (following / preceding convention).\n- Optional final rule modelled on § 193 BGB: if the result falls on a Saturday, Sunday or a public holiday at the chosen place, it moves to the next day that is none of these (extra closures and custom weekends are ignored for this rule).\n- Holiday data covers 2024–2030; dates outside that range are checked for weekends and closures only and trigger a warning.\n\nNot legal advice. Statutory and contractual deadlines have their own rules (start-day exclusion, service dates, court holidays, local holidays); verify critical deadlines with a qualified professional.",
        "tags": [
          "developer"
        ],
        "x-mcp-tool": "ruledate",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RuledateInput"
              },
              "examples": {
                "example1": {
                  "summary": "10 business days from 25 Sep 2026 in Bavaria",
                  "value": {
                    "startDate": "2026-09-25",
                    "operations": [
                      {
                        "op": "add-business-days",
                        "amount": 10
                      }
                    ],
                    "country": "DE",
                    "subdivision": "DE-BY"
                  }
                },
                "example2": {
                  "summary": "5 business days over Christmas in England, then end of month",
                  "value": {
                    "startDate": "2026-12-21",
                    "operations": [
                      {
                        "op": "add-business-days",
                        "amount": 5
                      },
                      {
                        "op": "end-of-month",
                        "amount": 0
                      },
                      {
                        "op": "previous-business-day"
                      }
                    ],
                    "country": "GB",
                    "subdivision": "GB-ENG"
                  }
                },
                "example3": {
                  "summary": "31 Aug + 1 month (clamped) + 3 days, § 193 BGB adjustment",
                  "value": {
                    "startDate": "2026-08-31",
                    "operations": [
                      {
                        "op": "add-months",
                        "amount": 1
                      },
                      {
                        "op": "add-calendar-days",
                        "amount": 3
                      }
                    ],
                    "country": "DE",
                    "finalRule": "bgb193"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RuledateResult"
                }
              }
            }
          },
          "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/safe-markdown-preview/calculate": {
      "post": {
        "operationId": "calculateSafeMarkdownPreview",
        "summary": "Render Markdown with GFM tables and footnotes to sanitised HTML and see what was removed.",
        "description": "Renders Markdown with headings, emphasis, lists, task lists, code, GFM tables, links, images, blockquotes and footnotes into HTML built from a strict allow-list. Raw HTML can be escaped, stripped or sanitised; scripts, event handlers, style attributes and javascript:/vbscript:/data: URLs are removed and listed in a security report. Shows a preview, the sanitised HTML source and a plain-text version.\n\nMethodology:\n- A two-pass parser written for this tool: link-reference and footnote definitions are collected first, then blocks (ATX/setext headings, fenced and indented code, blockquotes, nested bullet/ordered lists with task items, GFM tables with alignment, thematic breaks, HTML blocks, paragraphs) and inline syntax (code spans, emphasis, strikethrough, links, images, autolinks, hard breaks, backslash escapes). It follows CommonMark closely but is not a full conformance implementation; rare edge cases (complex emphasis nesting, lazy continuation inside nested lists) can differ.\n- All output HTML is generated by the renderer from an allow-list (p, h1–h6, lists, tables, code, a, img, blockquote, …). Text and attribute values are always escaped. Raw HTML is escaped, stripped or passed through a tokenizer that rebuilds only allow-listed tags with allow-listed attributes; script/style/iframe/object/svg and similar elements are removed with their content; on* handlers, style, id and class attributes are dropped.\n- URLs (Markdown links, images, href/src attributes) are decoded (entities, escapes) and stripped of control and whitespace characters before the scheme check, so obfuscations like “java&#x09;script:” are caught. Allowed: http, https, mailto, tel and relative URLs; data: only for base64 raster images when enabled. Links get rel=\"nofollow noopener noreferrer\".\n- Finally the HTML is balanced (stray closing tags dropped, open tags closed) so raw HTML cannot break out of the preview container. The page’s Content-Security-Policy blocks scripts and external images anyway; the preview is rendered in the browser from the sanitised HTML only.",
        "tags": [
          "developer"
        ],
        "x-mcp-tool": "safe_markdown_preview",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SafeMarkdownPreviewInput"
              },
              "examples": {
                "example1": {
                  "summary": "Release notes with table, tasks and footnote",
                  "value": {
                    "markdown": "# Release notes\n\nVersion **2.4** brings _faster_ parsing, `inline code` and ~~old bugs~~ fixes.[^perf]\n\n- [x] Tables (GFM)\n- [ ] Footnotes\n- Links: [docs](https://example.com/docs \"Documentation\") and <https://usefulweb.site>\n\n| Feature | Status | Notes |\n|:--------|:------:|------:|\n| Tables  | ✓      | GFM   |\n| Images  | ✓      | allow-listed |\n\n> Quote with a [reference link][ref].\n\n```js\nconsole.log(\"code is escaped: <b>\");\n```\n\n[ref]: https://commonmark.org/\n[^perf]: Measured on a 1 MB document.\n"
                  }
                },
                "example2": {
                  "summary": "XSS attempts are removed and reported",
                  "value": {
                    "markdown": "# Hello <img src=x onerror=alert(1)>\n\n<script>alert('xss')</script>\n\nClick [me](javascript:alert(document.cookie)) or [this](JaVaScRiPt&#58;alert(1)) or ![pixel](data:image/svg+xml;base64,PHN2Zz4=).\n\n<div onclick=\"steal()\" style=\"position:fixed\">A <b>bold</b> div with <a href=\"vbscript:msgbox(1)\">a link</a></div>\n\n<iframe src=\"https://evil.example\"></iframe>\n\n<a href=\"https://example.com\" onmouseover=\"x()\">safe link, unsafe handler</a>\n"
                  }
                },
                "example3": {
                  "summary": "Same input with raw HTML escaped",
                  "value": {
                    "markdown": "# Hello <img src=x onerror=alert(1)>\n\n<script>alert('xss')</script>\n\nClick [me](javascript:alert(document.cookie)) or [this](JaVaScRiPt&#58;alert(1)) or ![pixel](data:image/svg+xml;base64,PHN2Zz4=).\n\n<div onclick=\"steal()\" style=\"position:fixed\">A <b>bold</b> div with <a href=\"vbscript:msgbox(1)\">a link</a></div>\n\n<iframe src=\"https://evil.example\"></iframe>\n\n<a href=\"https://example.com\" onmouseover=\"x()\">safe link, unsafe handler</a>\n",
                    "rawHtml": "escape"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SafeMarkdownPreviewResult"
                }
              }
            }
          },
          "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/timefair/calculate": {
      "post": {
        "operationId": "calculateTimefair",
        "summary": "Find fair meeting times across time zones, with DST-exact local times and rotation.",
        "description": "Enter participants with their IANA time zone and working hours. TimeFair scores every candidate slot by how far it falls outside each person’s working day (extra penalty at night), ranks slots by total and worst-case inconvenience, and builds a rotation plan for recurring meetings so the pain is shared. Exports an .ics calendar file.\n\nMethodology:\n- Time zones are IANA names validated with Intl.DateTimeFormat; every UTC↔local conversion uses the runtime’s tz database, so DST changes and +05:30 / +05:45 offsets are exact for each individual minute.\n- Candidate slots start at the organiser’s local midnight of the first day and step by the chosen granularity (in UTC) until the last slot ends before midnight after the last day.\n- Inconvenience per participant = weight × (minutes outside the working window + 2 × minutes outside the window between 22:00 and 07:00 local) ÷ 60, i.e. 1 point per hour outside working hours and 3 points per hour at night. A day that is not a working day counts entirely as outside.\n- Overnight windows (end earlier than start) belong to the day they start on; e.g. 22:00–06:00 on a Friday covers Friday 22:00 to Saturday 06:00.\n- Fairness cost of a slot = total + 1 × worst individual inconvenience + 0.5 × standard deviation (population). Lower is better; ties go to the earliest slot.\n- Rotation (deterministic greedy): the 48 lowest-cost slots form the pool; each occurrence repeats the slot’s organiser-local wall time every N days, re-scored for that exact date (DST-aware). For each occurrence the slot minimising the worst cumulative burden, then the total cumulative burden, then its own cost, then start time, is picked.\n- The .ics file uses UTC (Z) times, RFC 5545 escaping and 75-octet line folding; UID is a SHA-256 hash of the slot, participants and title (stable across re-imports); DTSTAMP is the computation time.",
        "tags": [
          "developer"
        ],
        "x-mcp-tool": "timefair",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TimefairInput"
              },
              "examples": {
                "example1": {
                  "summary": "Berlin, New York, Bengaluru, Kathmandu",
                  "value": {
                    "title": "Platform sync",
                    "startDate": "2026-10-19",
                    "days": 5,
                    "durationMinutes": 60,
                    "granularity": "30",
                    "recurrences": 4,
                    "participants": [
                      {
                        "name": "Anna",
                        "timeZone": "Europe/Berlin",
                        "workStart": "09:00",
                        "workEnd": "17:30"
                      },
                      {
                        "name": "Ben",
                        "timeZone": "America/New_York",
                        "workStart": "09:00",
                        "workEnd": "17:00"
                      },
                      {
                        "name": "Chitra",
                        "timeZone": "Asia/Kolkata",
                        "workStart": "10:00",
                        "workEnd": "18:30"
                      },
                      {
                        "name": "Dev",
                        "timeZone": "Asia/Kathmandu",
                        "workStart": "10:00",
                        "workEnd": "17:00"
                      }
                    ]
                  }
                },
                "example2": {
                  "summary": "San Francisco, London, Sydney (no comfortable slot → rotation)",
                  "value": {
                    "startDate": "2026-11-02",
                    "days": 5,
                    "durationMinutes": 45,
                    "granularity": "15",
                    "recurrences": 6,
                    "participants": [
                      {
                        "name": "Sam",
                        "timeZone": "America/Los_Angeles",
                        "workStart": "08:00",
                        "workEnd": "17:00"
                      },
                      {
                        "name": "Lea",
                        "timeZone": "Europe/London",
                        "workStart": "09:00",
                        "workEnd": "17:30"
                      },
                      {
                        "name": "Kai",
                        "timeZone": "Australia/Sydney",
                        "workStart": "08:30",
                        "workEnd": "17:00"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimefairResult"
                }
              }
            }
          },
          "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/unitproof/calculate": {
      "post": {
        "operationId": "calculateUnitproof",
        "summary": "Unit maths you can audit: dimension check, exact factors and a full derivation tree.",
        "description": "Type an expression such as \"3.5 km/h * 2 h to m\", \"72 F to C\" or \"1500 W * 3 h to kWh\". UnitProof parses it, checks dimensions over the SI base units, applies exact NIST/SI conversion factors and shows every step as a derivation tree, including correct absolute-vs-difference temperature handling.\n\nMethodology:\n- A tokenizer and recursive-descent parser read numbers (incl. scientific notation), units with SI prefixes (q…Q, incl. µ/u) and binary prefixes (Ki…Ei for bit/B), ^ powers (also ² ³ and \"m2\"), × ÷ + − and parentheses. Juxtaposition (\"2 h\", \"kg m\") binds tighter than explicit * and /, so \"60 km / 2 h\" = 30 km/h.\n- Every quantity is a value in coherent SI units plus a dimension vector over m, kg, s, A, K, mol, cd and bit; ISO 4217 currency codes are carried as opaque dimensions (never converted). The table has 144 named units.\n- Multiplication adds dimension exponents, division subtracts them, powers scale them; addition, subtraction and conversion require identical dimensions, otherwise the calculation stops with an explanation of the mismatch.\n- Temperatures: \"72 F\" or \"-40 C\" (a number directly followed by °C/°F) is an absolute temperature converted with its offset; absolute − absolute gives a difference; absolute ± difference stays absolute; multiplying, dividing or powering °C/°F is refused as ambiguous (use K or deltaC/deltaF). Converting a difference to °C/°F applies only the scale factor.\n- Exact factors follow the SI Brochure (9th ed.) and NIST SP 811 Appendix B (international foot/pound, US liquid gallon = 231 in³, Btu_IT, thermochemical calorie, etc.); conventional or measured values (mmHg, inHg, dalton) are flagged as not exact.\n- The derivation graph lists literals, unit definitions (with factor), operations and the final conversion; values are IEEE-754 doubles, shown unrounded and rounded to the requested significant digits.",
        "tags": [
          "developer"
        ],
        "x-mcp-tool": "unitproof",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UnitproofInput"
              },
              "examples": {
                "example1": {
                  "summary": "Distance: 3.5 km/h for 2 h in metres",
                  "value": {
                    "expression": "3.5 km/h * 2 h to m"
                  }
                },
                "example2": {
                  "summary": "Temperature: 72 °F in °C",
                  "value": {
                    "expression": "72 F to C"
                  }
                },
                "example3": {
                  "summary": "Energy: 1500 W for 3 h in kWh",
                  "value": {
                    "expression": "1500 W * 3 h to kWh"
                  }
                },
                "example4": {
                  "summary": "Force: 75 kg at 9.81 m/s²",
                  "value": {
                    "expression": "9.81 m/s^2 * 75 kg to N"
                  }
                },
                "example5": {
                  "summary": "Mixed lengths: 1 mi + 200 m in km",
                  "value": {
                    "expression": "1 mi + 200 m to km",
                    "significantDigits": 4
                  }
                },
                "example6": {
                  "summary": "Opaque currency: 5 USD/kg × 2.5 kg",
                  "value": {
                    "expression": "5 USD/kg * 2.5 kg"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnitproofResult"
                }
              }
            }
          },
          "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/unix-permission-calculator/calculate": {
      "post": {
        "operationId": "calculateUnixPermissionCalculator",
        "summary": "chmod calculator: octal ↔ rwx, setuid/sticky, u+x style changes, umask and ls -l.",
        "description": "Converts Unix file modes between octal (755, 4755), symbolic (rwxr-xr-x) and ls -l strings, explains what owner, group and others may do, applies chmod expressions such as u+x,g-w,o=r or a+X to a base mode exactly like GNU chmod, and computes default file and directory modes from a umask.\n\nMethodology:\n- A mode has 12 bits: setuid (4000), setgid (2000), sticky (1000), then read (4), write (2) and execute (1) for owner, group and others. ls shows setuid/setgid as s in the execute position (S if execute is off) and the sticky bit as t (T).\n- chmod expressions follow GNU coreutils: clauses are separated by commas; who is any of u, g, o, a; operators + - =; permissions r w x X s t or a class to copy (g=u). X adds execute only for directories or when some execute bit is already set. s only affects u and g; t only affects o/a.\n- Without a who letter (e.g. +x), the bits masked by the umask are not changed, as in GNU chmod. For directories, GNU keeps setuid/setgid when you use = without s or a numeric mode of up to four digits; a fifth leading zero (00755) clears them.\n- umask: new files are created with 666 & ~umask and directories with 777 & ~umask (programs may request fewer bits).",
        "tags": [
          "developer"
        ],
        "x-mcp-tool": "unix_permission_calculator",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UnixPermissionCalculatorInput"
              },
              "examples": {
                "example1": {
                  "summary": "755 explained",
                  "value": {
                    "mode": "755"
                  }
                },
                "example2": {
                  "summary": "Apply u+x,g-w,o=r to 664",
                  "value": {
                    "mode": "664",
                    "chmod": "u+x,g-w,o=r"
                  }
                },
                "example3": {
                  "summary": "Parse ls -l \"drwxrwsr-t\" and umask 027",
                  "value": {
                    "mode": "drwxrwsr-t",
                    "umask": "027"
                  }
                },
                "example4": {
                  "summary": "a+X on a file without execute bits, then +t",
                  "value": {
                    "mode": "rw-r-----",
                    "chmod": "a+X,o+t"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnixPermissionCalculatorResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/workflows": {
      "get": {
        "operationId": "listWorkflows",
        "summary": "Multi-tool workflows",
        "responses": {
          "200": {
            "description": "Workflow list.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details. 422 responses include per-field `errors`.",
        "required": [
          "type",
          "title",
          "status",
          "detail"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          },
          "detail": {
            "type": "string"
          },
          "code": {
            "type": "string"
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "field",
                "message"
              ],
              "properties": {
                "field": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "HeaderlensInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "target": {
            "title": "Website address",
            "description": "Domain or URL. Only the hostname is checked and stored.",
            "type": "string",
            "maxLength": 2048
          }
        },
        "required": [
          "target"
        ]
      },
      "HeaderlensResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "hostname",
              "checkId",
              "observedAt",
              "classification",
              "consensusReason",
              "regions",
              "reportUrl",
              "fromCache"
            ],
            "properties": {
              "hostname": {
                "type": "string"
              },
              "checkId": {
                "type": "string"
              },
              "observedAt": {
                "type": "string",
                "format": "date-time"
              },
              "classification": {
                "type": "string",
                "enum": [
                  "up",
                  "reachable_restricted",
                  "degraded",
                  "down",
                  "inconclusive"
                ]
              },
              "consensusReason": {
                "type": "string",
                "enum": [
                  "single_region",
                  "unanimous",
                  "majority",
                  "partial_outage",
                  "no_conclusive_data"
                ]
              },
              "unavailableRegions": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "fromCache": {
                "type": "boolean"
              },
              "reportUrl": {
                "type": "string",
                "format": "uri"
              },
              "regions": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "region",
                    "classification",
                    "reason",
                    "httpStatus",
                    "durationMs",
                    "tlsValid"
                  ],
                  "properties": {
                    "region": {
                      "type": "string"
                    },
                    "classification": {
                      "type": "string",
                      "enum": [
                        "up",
                        "reachable_restricted",
                        "degraded",
                        "down",
                        "inconclusive"
                      ]
                    },
                    "reason": {
                      "type": "string",
                      "enum": [
                        "http_success",
                        "http_only",
                        "slow_response",
                        "tls_invalid",
                        "too_many_redirects",
                        "redirect_blocked",
                        "http_client_error",
                        "http_server_error",
                        "authentication_required",
                        "forbidden",
                        "rate_limited",
                        "bot_challenge",
                        "dns_nxdomain",
                        "dns_error",
                        "connection_refused",
                        "connection_timeout",
                        "connection_failed"
                      ]
                    },
                    "httpStatus": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "durationMs": {
                      "type": [
                        "integer",
                        "null"
                      ]
                    },
                    "tlsValid": {
                      "type": [
                        "boolean",
                        "null"
                      ]
                    }
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "A11ySnapshotInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "url": {
            "title": "Page URL",
            "description": "Fetched once, server-side, with the static HTML only (no JavaScript is executed).",
            "type": "string",
            "format": "uri"
          },
          "html": {
            "title": "Or paste HTML",
            "description": "Takes precedence over the URL. Useful for pages behind a login or local drafts.",
            "type": "string",
            "maxLength": 500000
          },
          "maxFindings": {
            "title": "Max findings listed",
            "type": "integer",
            "minimum": 5,
            "maximum": 500,
            "default": 100
          }
        },
        "required": []
      },
      "A11ySnapshotResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "origin",
              "stats",
              "totals",
              "findings",
              "findingsTruncated",
              "manualChecks",
              "criteriaWithFailures",
              "conformanceStatement"
            ],
            "properties": {
              "origin": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "kind",
                  "truncated"
                ],
                "properties": {
                  "kind": {
                    "type": "string",
                    "enum": [
                      "url",
                      "pasted"
                    ]
                  },
                  "requestedUrl": {
                    "type": "string"
                  },
                  "finalUrl": {
                    "type": "string"
                  },
                  "status": {
                    "type": "integer"
                  },
                  "contentType": {
                    "type": "string"
                  },
                  "fetchedAt": {
                    "type": "string"
                  },
                  "truncated": {
                    "type": "boolean"
                  }
                }
              },
              "stats": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "elements",
                  "images",
                  "imagesWithAlt",
                  "links",
                  "buttons",
                  "formControls",
                  "headings",
                  "h1Count",
                  "landmarks",
                  "tables",
                  "iframes",
                  "media",
                  "lang",
                  "title"
                ],
                "properties": {
                  "elements": {
                    "type": "integer"
                  },
                  "images": {
                    "type": "integer"
                  },
                  "imagesWithAlt": {
                    "type": "integer"
                  },
                  "links": {
                    "type": "integer"
                  },
                  "buttons": {
                    "type": "integer"
                  },
                  "formControls": {
                    "type": "integer"
                  },
                  "headings": {
                    "type": "integer"
                  },
                  "h1Count": {
                    "type": "integer"
                  },
                  "landmarks": {
                    "type": "integer"
                  },
                  "tables": {
                    "type": "integer"
                  },
                  "iframes": {
                    "type": "integer"
                  },
                  "media": {
                    "type": "integer"
                  },
                  "lang": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "title": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              },
              "totals": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "findings",
                  "failures",
                  "bestPractice",
                  "needsReview",
                  "critical",
                  "serious",
                  "moderate",
                  "minor"
                ],
                "properties": {
                  "findings": {
                    "type": "integer"
                  },
                  "failures": {
                    "type": "integer"
                  },
                  "bestPractice": {
                    "type": "integer"
                  },
                  "needsReview": {
                    "type": "integer"
                  },
                  "critical": {
                    "type": "integer"
                  },
                  "serious": {
                    "type": "integer"
                  },
                  "moderate": {
                    "type": "integer"
                  },
                  "minor": {
                    "type": "integer"
                  }
                }
              },
              "findings": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "ruleId",
                    "title",
                    "wcag",
                    "level",
                    "kind",
                    "severity",
                    "message",
                    "selector",
                    "line",
                    "snippet"
                  ],
                  "properties": {
                    "ruleId": {
                      "type": "string"
                    },
                    "title": {
                      "type": "string"
                    },
                    "wcag": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "pattern": "^\\d\\.\\d\\.\\d+$"
                      }
                    },
                    "level": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "enum": [
                        "A",
                        "AA",
                        null
                      ]
                    },
                    "kind": {
                      "type": "string",
                      "enum": [
                        "failure",
                        "best-practice",
                        "needs-review"
                      ]
                    },
                    "severity": {
                      "type": "string",
                      "enum": [
                        "critical",
                        "serious",
                        "moderate",
                        "minor"
                      ]
                    },
                    "message": {
                      "type": "string"
                    },
                    "selector": {
                      "type": "string"
                    },
                    "line": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "snippet": {
                      "type": "string"
                    }
                  }
                }
              },
              "findingsTruncated": {
                "type": "boolean"
              },
              "manualChecks": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "sc",
                    "title",
                    "level",
                    "reason"
                  ],
                  "properties": {
                    "sc": {
                      "type": "string"
                    },
                    "title": {
                      "type": "string"
                    },
                    "level": {
                      "type": "string",
                      "enum": [
                        "A",
                        "AA"
                      ]
                    },
                    "reason": {
                      "type": "string"
                    }
                  }
                }
              },
              "criteriaWithFailures": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "WCAG 2.2 success criteria with at least one automated failure."
              },
              "conformanceStatement": {
                "type": "string"
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "BrowserCompatibilityCheckerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "query": {
            "title": "Feature",
            "description": "A BCD key (dot path) or search words.",
            "type": "string",
            "maxLength": 200,
            "default": "css.properties.container"
          },
          "source": {
            "title": "Data",
            "type": "string",
            "enum": [
              "live",
              "bundled"
            ],
            "default": "live"
          },
          "maxResults": {
            "title": "Maximum search results",
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 10
          }
        },
        "required": [
          "query"
        ]
      },
      "BrowserCompatibilityCheckerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "required": [
              "query",
              "matches",
              "data"
            ],
            "properties": {
              "query": {
                "type": "string"
              },
              "matches": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "feature": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "key": {
                    "type": "string"
                  },
                  "mdnUrl": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "specUrl": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "description": {
                    "type": "string"
                  },
                  "experimental": {
                    "type": "boolean"
                  },
                  "standardTrack": {
                    "type": "boolean"
                  },
                  "deprecated": {
                    "type": "boolean"
                  },
                  "baseline": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "properties": {
                      "status": {
                        "type": "string",
                        "enum": [
                          "high",
                          "low",
                          "limited"
                        ]
                      },
                      "lowDate": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "highDate": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "feature": {
                        "type": "string"
                      },
                      "name": {
                        "type": "string"
                      }
                    }
                  },
                  "support": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "browser",
                        "versionAdded",
                        "text",
                        "supported"
                      ],
                      "properties": {
                        "browser": {
                          "type": "string"
                        },
                        "versionAdded": {
                          "type": [
                            "string",
                            "boolean",
                            "null"
                          ]
                        },
                        "versionRemoved": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "text": {
                          "type": "string"
                        },
                        "supported": {
                          "type": "boolean"
                        },
                        "currentVersion": {
                          "type": [
                            "string",
                            "null"
                          ]
                        }
                      }
                    }
                  }
                }
              },
              "data": {
                "type": "object",
                "required": [
                  "origin",
                  "bcdVersion",
                  "bcdTimestamp"
                ],
                "properties": {
                  "origin": {
                    "type": "string",
                    "enum": [
                      "live",
                      "cache",
                      "bundled"
                    ]
                  },
                  "bcdVersion": {
                    "type": "string"
                  },
                  "bcdTimestamp": {
                    "type": "string"
                  },
                  "webFeaturesVersion": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "fetchedAt": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "featureCount": {
                    "type": "integer"
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "CiteshapeInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "identifier": {
            "title": "DOI, ORCID iD, ISBN or arXiv ID",
            "type": "string",
            "maxLength": 500
          },
          "resolve": {
            "title": "Look up metadata online (Crossref / ORCID / arXiv)",
            "type": "boolean",
            "default": true
          }
        },
        "required": [
          "identifier"
        ]
      },
      "CiteshapeResult": {
        "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": [
              "kind",
              "id",
              "valid",
              "problem",
              "canonicalUrl",
              "resolved",
              "resolver",
              "work",
              "person",
              "citations"
            ],
            "properties": {
              "kind": {
                "type": "string",
                "enum": [
                  "doi",
                  "orcid",
                  "isbn",
                  "arxiv"
                ]
              },
              "id": {
                "type": "string"
              },
              "valid": {
                "type": "boolean"
              },
              "problem": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "canonicalUrl": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "resolved": {
                "type": "boolean"
              },
              "resolver": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "work": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "type",
                  "title",
                  "authors",
                  "container",
                  "publisher",
                  "year",
                  "month",
                  "day",
                  "volume",
                  "issue",
                  "pages",
                  "doi",
                  "url"
                ],
                "properties": {
                  "type": {
                    "type": "string"
                  },
                  "title": {
                    "type": "string"
                  },
                  "authors": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "given",
                        "family",
                        "orcid"
                      ],
                      "properties": {
                        "given": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "family": {
                          "type": "string"
                        },
                        "orcid": {
                          "type": [
                            "string",
                            "null"
                          ]
                        }
                      }
                    }
                  },
                  "container": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "publisher": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "year": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "month": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "day": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "volume": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "issue": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "pages": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "doi": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              },
              "person": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "name",
                  "works"
                ],
                "properties": {
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "works": {
                    "type": "integer"
                  }
                }
              },
              "citations": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "apa",
                  "bibtex",
                  "ris"
                ],
                "properties": {
                  "apa": {
                    "type": "string"
                  },
                  "bibtex": {
                    "type": "string"
                  },
                  "ris": {
                    "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"
              }
            }
          }
        }
      },
      "CyberchefLitePipelineInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "input": {
            "title": "Input",
            "type": "string",
            "maxLength": 2000000
          },
          "inputFile": {
            "title": "Or upload a file",
            "description": "Up to 10 MB, processed as raw bytes. Upload as {filename, contentType?, contentBase64}. Max 10240 KiB. Accepts */*.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "preset": {
            "title": "Recipe",
            "type": "string",
            "enum": [
              "jwt-decode",
              "base64-gunzip-json",
              "url-decode-twice",
              "hex-dump",
              "base64-decode",
              "hex-to-text",
              "sha256",
              "magic",
              "custom"
            ],
            "default": "magic"
          },
          "step1": {
            "title": "Step 1",
            "description": "Only used with “Custom”.",
            "type": "string",
            "enum": [
              "",
              "from-base64",
              "to-base64",
              "from-hex",
              "to-hex",
              "to-hexdump",
              "url-decode",
              "url-encode",
              "html-decode",
              "html-encode",
              "gunzip",
              "gzip",
              "inflate",
              "inflate-raw",
              "brotli-decompress",
              "json-pretty",
              "json-minify",
              "jwt-decode",
              "from-base32",
              "punycode-decode",
              "qp-decode",
              "rot13",
              "uuid-parse",
              "timestamp",
              "magic",
              "entropy",
              "crc32",
              "hash-md5",
              "hash-sha1",
              "hash-sha256",
              "hash-sha512",
              "upper",
              "lower"
            ]
          },
          "step2": {
            "title": "Step 2",
            "type": "string",
            "enum": [
              "",
              "from-base64",
              "to-base64",
              "from-hex",
              "to-hex",
              "to-hexdump",
              "url-decode",
              "url-encode",
              "html-decode",
              "html-encode",
              "gunzip",
              "gzip",
              "inflate",
              "inflate-raw",
              "brotli-decompress",
              "json-pretty",
              "json-minify",
              "jwt-decode",
              "from-base32",
              "punycode-decode",
              "qp-decode",
              "rot13",
              "uuid-parse",
              "timestamp",
              "magic",
              "entropy",
              "crc32",
              "hash-md5",
              "hash-sha1",
              "hash-sha256",
              "hash-sha512",
              "upper",
              "lower"
            ]
          },
          "step3": {
            "title": "Step 3",
            "type": "string",
            "enum": [
              "",
              "from-base64",
              "to-base64",
              "from-hex",
              "to-hex",
              "to-hexdump",
              "url-decode",
              "url-encode",
              "html-decode",
              "html-encode",
              "gunzip",
              "gzip",
              "inflate",
              "inflate-raw",
              "brotli-decompress",
              "json-pretty",
              "json-minify",
              "jwt-decode",
              "from-base32",
              "punycode-decode",
              "qp-decode",
              "rot13",
              "uuid-parse",
              "timestamp",
              "magic",
              "entropy",
              "crc32",
              "hash-md5",
              "hash-sha1",
              "hash-sha256",
              "hash-sha512",
              "upper",
              "lower"
            ]
          },
          "step4": {
            "title": "Step 4",
            "type": "string",
            "enum": [
              "",
              "from-base64",
              "to-base64",
              "from-hex",
              "to-hex",
              "to-hexdump",
              "url-decode",
              "url-encode",
              "html-decode",
              "html-encode",
              "gunzip",
              "gzip",
              "inflate",
              "inflate-raw",
              "brotli-decompress",
              "json-pretty",
              "json-minify",
              "jwt-decode",
              "from-base32",
              "punycode-decode",
              "qp-decode",
              "rot13",
              "uuid-parse",
              "timestamp",
              "magic",
              "entropy",
              "crc32",
              "hash-md5",
              "hash-sha1",
              "hash-sha256",
              "hash-sha512",
              "upper",
              "lower"
            ]
          },
          "step5": {
            "title": "Step 5",
            "type": "string",
            "enum": [
              "",
              "from-base64",
              "to-base64",
              "from-hex",
              "to-hex",
              "to-hexdump",
              "url-decode",
              "url-encode",
              "html-decode",
              "html-encode",
              "gunzip",
              "gzip",
              "inflate",
              "inflate-raw",
              "brotli-decompress",
              "json-pretty",
              "json-minify",
              "jwt-decode",
              "from-base32",
              "punycode-decode",
              "qp-decode",
              "rot13",
              "uuid-parse",
              "timestamp",
              "magic",
              "entropy",
              "crc32",
              "hash-md5",
              "hash-sha1",
              "hash-sha256",
              "hash-sha512",
              "upper",
              "lower"
            ]
          }
        },
        "required": []
      },
      "CyberchefLitePipelineResult": {
        "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": [
              "preset",
              "inputBytes",
              "recipe",
              "steps",
              "failed",
              "output",
              "artifact"
            ],
            "properties": {
              "preset": {
                "type": "string"
              },
              "inputBytes": {
                "type": "integer"
              },
              "recipe": {
                "type": "string",
                "description": "Equivalent Crypto Kitchen recipe"
              },
              "steps": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "index",
                    "op",
                    "label",
                    "args",
                    "bytes",
                    "kind",
                    "preview",
                    "notes",
                    "error"
                  ],
                  "properties": {
                    "index": {
                      "type": "integer"
                    },
                    "op": {
                      "type": "string"
                    },
                    "label": {
                      "type": "string"
                    },
                    "args": {
                      "type": "string",
                      "description": "Arguments as given; secret values are hidden."
                    },
                    "bytes": {
                      "type": "integer"
                    },
                    "kind": {
                      "type": "string",
                      "enum": [
                        "text",
                        "binary"
                      ]
                    },
                    "preview": {
                      "type": "string"
                    },
                    "notes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "error": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                }
              },
              "failed": {
                "type": "boolean"
              },
              "output": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "bytes",
                  "kind",
                  "text",
                  "hex",
                  "base64",
                  "sha256",
                  "truncated"
                ],
                "properties": {
                  "bytes": {
                    "type": "integer"
                  },
                  "kind": {
                    "type": "string",
                    "enum": [
                      "text",
                      "binary"
                    ]
                  },
                  "text": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "hex": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "base64": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "truncated": {
                    "type": "boolean",
                    "description": "true if text/hex/base64 were cut to 100,000 characters (download the artifact for everything)"
                  }
                }
              },
              "artifact": {
                "type": [
                  "object",
                  "null"
                ],
                "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"
                  }
                }
              }
            }
          },
          "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"
              }
            }
          }
        }
      },
      "DatafreshInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "url": {
            "title": "Dataset or API URL",
            "description": "Public http(s) JSON or CSV, max 2 MiB.",
            "type": "string",
            "format": "uri"
          },
          "content": {
            "title": "Or paste JSON/CSV content",
            "type": "string",
            "maxLength": 2000000
          },
          "format": {
            "title": "Format",
            "type": "string",
            "enum": [
              "auto",
              "json",
              "csv"
            ],
            "default": "auto"
          },
          "timestampField": {
            "title": "Timestamp field (optional)",
            "description": "Leave empty to detect (updated_at, date, …). Nested: parent.child",
            "type": "string",
            "maxLength": 120
          },
          "expectedCadenceHours": {
            "title": "Expected update interval",
            "description": "24 = daily, 168 = weekly, 720 ≈ monthly, 8760 = yearly.",
            "type": "number",
            "minimum": 0.1,
            "maximum": 87600,
            "default": 24,
            "x-unit": "hours"
          },
          "previousSchema": {
            "title": "Previous schema (optional, JSON from an earlier result)",
            "type": "string",
            "maxLength": 200000
          },
          "remember": {
            "title": "Remember this URL's schema for the next check",
            "description": "Stores only a hash of the URL plus the field list.",
            "type": "boolean",
            "default": true
          }
        },
        "required": []
      },
      "DatafreshResult": {
        "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": [
              "status",
              "source",
              "records",
              "recordPath",
              "timestampField",
              "newestRecordAt",
              "ageHours",
              "expectedCadenceHours",
              "schema",
              "schemaFingerprint",
              "previousFingerprint",
              "drift",
              "httpLastModified"
            ],
            "properties": {
              "status": {
                "type": "string",
                "enum": [
                  "healthy",
                  "stale",
                  "schema_changed",
                  "unavailable",
                  "no_timestamp"
                ]
              },
              "source": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "kind",
                  "url",
                  "httpStatus",
                  "fetchedAt",
                  "format"
                ],
                "properties": {
                  "kind": {
                    "type": "string",
                    "enum": [
                      "url",
                      "pasted"
                    ]
                  },
                  "url": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "httpStatus": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "fetchedAt": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "format": {
                    "type": "string",
                    "enum": [
                      "json",
                      "csv"
                    ]
                  }
                }
              },
              "records": {
                "type": "integer"
              },
              "recordPath": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "timestampField": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "newestRecordAt": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time"
              },
              "ageHours": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "expectedCadenceHours": {
                "type": "number"
              },
              "httpLastModified": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "schema": {
                "type": "object",
                "additionalProperties": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "types",
                    "presence"
                  ],
                  "properties": {
                    "types": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "presence": {
                      "type": "number"
                    }
                  }
                }
              },
              "schemaFingerprint": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "previousFingerprint": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "drift": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "added",
                  "removed",
                  "typeChanged"
                ],
                "properties": {
                  "added": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "removed": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "typeChanged": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "field",
                        "before",
                        "after"
                      ],
                      "properties": {
                        "field": {
                          "type": "string"
                        },
                        "before": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "after": {
                          "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"
              }
            }
          }
        }
      },
      "FilefitInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "format": {
            "title": "File format",
            "type": "string",
            "enum": [
              "docx",
              "doc",
              "odt",
              "rtf",
              "txt",
              "html",
              "pdf",
              "epub",
              "pages",
              "xlsx",
              "xls",
              "heic",
              "avif",
              "webp",
              "jxl",
              "jpeg",
              "png",
              "tiff",
              "gif",
              "mp4-h264",
              "webm",
              "ogv",
              "hevc",
              "av1",
              "mov",
              "mkv",
              "avi",
              "mp3",
              "flac",
              "opus",
              "wav",
              "ogg"
            ],
            "default": "heic"
          },
          "target": {
            "title": "Application, or format to convert to",
            "type": "string",
            "enum": [
              "any",
              "app:word",
              "app:lo-writer",
              "app:lo-calc",
              "app:google-docs",
              "app:pages",
              "app:chrome",
              "app:edge",
              "app:firefox",
              "app:safari",
              "app:windows-photos",
              "app:apple-devices",
              "app:imagemagick",
              "app:ffmpeg",
              "fmt:docx",
              "fmt:doc",
              "fmt:odt",
              "fmt:rtf",
              "fmt:txt",
              "fmt:html",
              "fmt:pdf",
              "fmt:epub",
              "fmt:pages",
              "fmt:xlsx",
              "fmt:xls",
              "fmt:heic",
              "fmt:avif",
              "fmt:webp",
              "fmt:jxl",
              "fmt:jpeg",
              "fmt:png",
              "fmt:tiff",
              "fmt:gif",
              "fmt:mp4-h264",
              "fmt:webm",
              "fmt:ogv",
              "fmt:hevc",
              "fmt:av1",
              "fmt:mov",
              "fmt:mkv",
              "fmt:avi",
              "fmt:mp3",
              "fmt:flac",
              "fmt:opus",
              "fmt:wav",
              "fmt:ogg"
            ],
            "default": "any"
          },
          "operation": {
            "title": "What do you want to do?",
            "type": "string",
            "enum": [
              "any",
              "open",
              "edit",
              "export",
              "display",
              "play",
              "convert"
            ],
            "default": "any"
          }
        },
        "required": []
      },
      "FilefitResult": {
        "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": [
              "format",
              "capabilities",
              "conversion",
              "factsVerifiedOn"
            ],
            "properties": {
              "format": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "id",
                  "name",
                  "extensions"
                ],
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  },
                  "extensions": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                }
              },
              "factsVerifiedOn": {
                "type": "string"
              },
              "capabilities": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "factId",
                    "app",
                    "appName",
                    "operation",
                    "support",
                    "caveat",
                    "since",
                    "source"
                  ],
                  "properties": {
                    "factId": {
                      "type": "string"
                    },
                    "app": {
                      "type": "string"
                    },
                    "appName": {
                      "type": "string"
                    },
                    "operation": {
                      "type": "string"
                    },
                    "support": {
                      "type": "string",
                      "enum": [
                        "yes",
                        "partial",
                        "requires-extension",
                        "no",
                        "not-listed"
                      ]
                    },
                    "caveat": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "since": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "source": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "title",
                        "url",
                        "retrievedAt"
                      ],
                      "properties": {
                        "title": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        },
                        "retrievedAt": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              },
              "conversion": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "to",
                  "found",
                  "steps",
                  "directAlternatives"
                ],
                "properties": {
                  "to": {
                    "type": "string"
                  },
                  "found": {
                    "type": "boolean"
                  },
                  "directAlternatives": {
                    "type": "array",
                    "description": "Every single-app conversion, best fidelity first",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "app",
                        "facts",
                        "cost"
                      ],
                      "properties": {
                        "app": {
                          "type": "string"
                        },
                        "facts": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "cost": {
                          "type": "integer"
                        }
                      }
                    }
                  },
                  "steps": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "from",
                        "to",
                        "app",
                        "facts"
                      ],
                      "properties": {
                        "from": {
                          "type": "string"
                        },
                        "to": {
                          "type": "string"
                        },
                        "app": {
                          "type": "string"
                        },
                        "facts": {
                          "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"
              }
            }
          }
        }
      },
      "LocalekitInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "country": {
            "title": "Country",
            "type": "string",
            "enum": [
              "AC",
              "AD",
              "AE",
              "AF",
              "AG",
              "AI",
              "AL",
              "AM",
              "AO",
              "AQ",
              "AR",
              "AS",
              "AT",
              "AU",
              "AW",
              "AX",
              "AZ",
              "BA",
              "BB",
              "BD",
              "BE",
              "BF",
              "BG",
              "BH",
              "BI",
              "BJ",
              "BL",
              "BM",
              "BN",
              "BO",
              "BQ",
              "BR",
              "BS",
              "BT",
              "BV",
              "BW",
              "BY",
              "BZ",
              "CA",
              "CC",
              "CD",
              "CF",
              "CG",
              "CH",
              "CI",
              "CK",
              "CL",
              "CM",
              "CN",
              "CO",
              "CR",
              "CU",
              "CV",
              "CW",
              "CX",
              "CY",
              "CZ",
              "DE",
              "DJ",
              "DK",
              "DM",
              "DO",
              "DZ",
              "EC",
              "EE",
              "EG",
              "EH",
              "ER",
              "ES",
              "ET",
              "FI",
              "FJ",
              "FK",
              "FM",
              "FO",
              "FR",
              "GA",
              "GB",
              "GD",
              "GE",
              "GF",
              "GG",
              "GH",
              "GI",
              "GL",
              "GM",
              "GN",
              "GP",
              "GQ",
              "GR",
              "GS",
              "GT",
              "GU",
              "GW",
              "GY",
              "HK",
              "HM",
              "HN",
              "HR",
              "HT",
              "HU",
              "ID",
              "IE",
              "IL",
              "IM",
              "IN",
              "IO",
              "IQ",
              "IR",
              "IS",
              "IT",
              "JE",
              "JM",
              "JO",
              "JP",
              "KE",
              "KG",
              "KH",
              "KI",
              "KM",
              "KN",
              "KP",
              "KR",
              "KW",
              "KY",
              "KZ",
              "LA",
              "LB",
              "LC",
              "LI",
              "LK",
              "LR",
              "LS",
              "LT",
              "LU",
              "LV",
              "LY",
              "MA",
              "MC",
              "MD",
              "ME",
              "MF",
              "MG",
              "MH",
              "MK",
              "ML",
              "MM",
              "MN",
              "MO",
              "MP",
              "MQ",
              "MR",
              "MS",
              "MT",
              "MU",
              "MV",
              "MW",
              "MX",
              "MY",
              "MZ",
              "NA",
              "NC",
              "NE",
              "NF",
              "NG",
              "NI",
              "NL",
              "NO",
              "NP",
              "NR",
              "NU",
              "NZ",
              "OM",
              "PA",
              "PE",
              "PF",
              "PG",
              "PH",
              "PK",
              "PL",
              "PM",
              "PN",
              "PR",
              "PS",
              "PT",
              "PW",
              "PY",
              "QA",
              "RE",
              "RO",
              "RS",
              "RU",
              "RW",
              "SA",
              "SB",
              "SC",
              "SD",
              "SE",
              "SG",
              "SH",
              "SI",
              "SJ",
              "SK",
              "SL",
              "SM",
              "SN",
              "SO",
              "SR",
              "SS",
              "ST",
              "SV",
              "SX",
              "SY",
              "SZ",
              "TA",
              "TC",
              "TD",
              "TF",
              "TG",
              "TH",
              "TJ",
              "TK",
              "TL",
              "TM",
              "TN",
              "TO",
              "TR",
              "TT",
              "TV",
              "TW",
              "TZ",
              "UA",
              "UG",
              "UM",
              "US",
              "UY",
              "UZ",
              "VA",
              "VC",
              "VE",
              "VG",
              "VI",
              "VN",
              "VU",
              "WF",
              "WS",
              "XK",
              "YE",
              "YT",
              "ZA",
              "ZM",
              "ZW"
            ],
            "default": "DE"
          },
          "postalCode": {
            "title": "Postal code to validate (optional)",
            "type": "string",
            "maxLength": 20
          },
          "phone": {
            "title": "Phone number to normalise (optional)",
            "description": "National or international format; extensions (ext. 12) are dropped.",
            "type": "string",
            "maxLength": 40
          }
        },
        "required": [
          "country"
        ]
      },
      "LocalekitResult": {
        "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": [
              "country",
              "countryName",
              "form",
              "postal",
              "subdivisions",
              "phone",
              "locale"
            ],
            "properties": {
              "country": {
                "type": "string",
                "pattern": "^[A-Z]{2}$"
              },
              "countryName": {
                "type": "string"
              },
              "form": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "format",
                  "latinFormat",
                  "fields",
                  "unmappedTokens"
                ],
                "properties": {
                  "format": {
                    "type": "string"
                  },
                  "latinFormat": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "unmappedTokens": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "fields": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "key",
                        "token",
                        "label",
                        "required",
                        "uppercase",
                        "line"
                      ],
                      "properties": {
                        "key": {
                          "type": "string"
                        },
                        "token": {
                          "type": "string"
                        },
                        "label": {
                          "type": "string"
                        },
                        "required": {
                          "type": "boolean"
                        },
                        "uppercase": {
                          "type": "boolean"
                        },
                        "line": {
                          "type": "integer",
                          "minimum": 1
                        }
                      }
                    }
                  }
                }
              },
              "postal": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "used",
                  "label",
                  "pattern",
                  "examples",
                  "input",
                  "normalisedInput",
                  "valid",
                  "lookupUrl"
                ],
                "properties": {
                  "used": {
                    "type": "boolean"
                  },
                  "label": {
                    "type": "string"
                  },
                  "pattern": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "examples": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "input": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "normalisedInput": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "valid": {
                    "type": [
                      "boolean",
                      "null"
                    ]
                  },
                  "lookupUrl": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              },
              "subdivisions": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "label",
                  "count",
                  "items"
                ],
                "properties": {
                  "label": {
                    "type": "string"
                  },
                  "count": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "items": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "key",
                        "name",
                        "isoCode"
                      ],
                      "properties": {
                        "key": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "isoCode": {
                          "type": [
                            "string",
                            "null"
                          ]
                        }
                      }
                    }
                  }
                }
              },
              "phone": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "callingCode",
                  "internationalPrefix",
                  "nationalPrefix",
                  "possibleNationalLengths",
                  "input",
                  "e164",
                  "nationalNumber",
                  "plausibleLength",
                  "steps"
                ],
                "properties": {
                  "callingCode": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "internationalPrefix": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "nationalPrefix": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "possibleNationalLengths": {
                    "type": "array",
                    "items": {
                      "type": "integer"
                    }
                  },
                  "input": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "e164": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "pattern": "^\\+[1-9]\\d{1,14}$"
                  },
                  "nationalNumber": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "plausibleLength": {
                    "type": [
                      "boolean",
                      "null"
                    ]
                  },
                  "steps": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                }
              },
              "locale": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "assumedLocale",
                  "dateShort",
                  "dateMedium",
                  "dateLong",
                  "time",
                  "number",
                  "firstDayOfWeek",
                  "currency"
                ],
                "properties": {
                  "assumedLocale": {
                    "type": "string"
                  },
                  "dateShort": {
                    "type": "string"
                  },
                  "dateMedium": {
                    "type": "string"
                  },
                  "dateLong": {
                    "type": "string"
                  },
                  "time": {
                    "type": "string"
                  },
                  "number": {
                    "type": "string"
                  },
                  "firstDayOfWeek": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "currency": {
                    "type": "null",
                    "description": "ECMA-402 Intl has no region→currency mapping, so this is never guessed."
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "NetworkSpeedTesterInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "pingSamples": {
            "title": "Latency samples (ms)",
            "description": "Round-trip times in milliseconds, separated by commas or spaces. The browser test fills this in.",
            "type": "string",
            "maxLength": 5000
          },
          "downloadBytes": {
            "title": "Downloaded bytes",
            "type": "integer",
            "minimum": 0,
            "maximum": 10000000000
          },
          "downloadMs": {
            "title": "Download time",
            "type": "number",
            "minimum": 0,
            "maximum": 3600000,
            "x-unit": "ms"
          },
          "uploadBytes": {
            "title": "Uploaded bytes",
            "type": "integer",
            "minimum": 0,
            "maximum": 10000000000
          },
          "uploadMs": {
            "title": "Upload time",
            "type": "number",
            "minimum": 0,
            "maximum": 3600000,
            "x-unit": "ms"
          }
        },
        "required": []
      },
      "NetworkSpeedTesterResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "required": [
              "measured",
              "latency",
              "downloadMbps",
              "uploadMbps",
              "endpoints"
            ],
            "properties": {
              "measured": {
                "type": "boolean"
              },
              "latency": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "count": {
                    "type": "integer"
                  },
                  "min": {
                    "type": "number"
                  },
                  "median": {
                    "type": "number"
                  },
                  "mean": {
                    "type": "number"
                  },
                  "p90": {
                    "type": "number"
                  },
                  "max": {
                    "type": "number"
                  },
                  "jitter": {
                    "type": "number"
                  }
                }
              },
              "downloadMbps": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "uploadMbps": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "suitability": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "use",
                    "ok"
                  ],
                  "properties": {
                    "use": {
                      "type": "string"
                    },
                    "ok": {
                      "type": [
                        "boolean",
                        "null"
                      ]
                    },
                    "note": {
                      "type": "string"
                    }
                  }
                }
              },
              "endpoints": {
                "type": "object",
                "properties": {
                  "ping": {
                    "type": "string"
                  },
                  "download": {
                    "type": "string"
                  },
                  "upload": {
                    "type": "string"
                  },
                  "maxBytes": {
                    "type": "integer"
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "RuledateInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "startDate": {
            "title": "Start date",
            "type": "string",
            "format": "date"
          },
          "operations": {
            "title": "Operations (applied in order)",
            "type": "array",
            "minItems": 1,
            "maxItems": 20,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "op": {
                  "title": "Operation",
                  "type": "string",
                  "enum": [
                    "add-business-days",
                    "add-calendar-days",
                    "add-weeks",
                    "add-months",
                    "end-of-month",
                    "next-business-day",
                    "previous-business-day"
                  ]
                },
                "amount": {
                  "title": "Amount",
                  "description": "Negative values go backwards.",
                  "type": "integer",
                  "minimum": -3650,
                  "maximum": 3650,
                  "default": 0
                }
              },
              "required": [
                "op"
              ]
            }
          },
          "country": {
            "title": "Holiday calendar",
            "type": "string",
            "enum": [
              "none",
              "DE",
              "AT",
              "CH",
              "US",
              "GB",
              "FR",
              "NL",
              "BE",
              "ES",
              "IT",
              "PL",
              "SE",
              "DK",
              "IE",
              "CA",
              "AU"
            ],
            "default": "DE"
          },
          "subdivision": {
            "title": "Subdivision (optional)",
            "description": "ISO 3166-2 code, e.g. DE-BY (Bavaria), CH-ZH, US-CA. Without it only nationwide holidays count.",
            "type": "string",
            "maxLength": 10
          },
          "weekendDays": {
            "title": "Weekend days",
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "sun",
                "mon",
                "tue",
                "wed",
                "thu",
                "fri",
                "sat"
              ]
            },
            "default": [
              "sat",
              "sun"
            ]
          },
          "closures": {
            "title": "Extra closure dates",
            "description": "One YYYY-MM-DD per line (company holidays, bridge days).",
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 366
          },
          "monthEndRule": {
            "title": "Month arithmetic",
            "type": "string",
            "enum": [
              "clamp",
              "overflow"
            ],
            "default": "clamp"
          },
          "finalRule": {
            "title": "Final adjustment",
            "type": "string",
            "enum": [
              "none",
              "bgb193"
            ],
            "default": "none"
          }
        },
        "required": [
          "startDate",
          "operations"
        ]
      },
      "RuledateResult": {
        "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": [
              "startDate",
              "finalDate",
              "finalWeekday",
              "country",
              "subdivision",
              "weekendDays",
              "steps",
              "holidaysApplied",
              "dataRange",
              "outsideDataRange"
            ],
            "properties": {
              "startDate": {
                "type": "string",
                "format": "date"
              },
              "finalDate": {
                "type": "string",
                "format": "date"
              },
              "finalWeekday": {
                "type": "string"
              },
              "country": {
                "type": "string"
              },
              "subdivision": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "weekendDays": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "steps": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "step",
                    "operation",
                    "amount",
                    "from",
                    "to",
                    "skipped",
                    "note"
                  ],
                  "properties": {
                    "step": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "operation": {
                      "type": "string"
                    },
                    "amount": {
                      "type": "integer"
                    },
                    "from": {
                      "type": "string",
                      "format": "date"
                    },
                    "to": {
                      "type": "string",
                      "format": "date"
                    },
                    "note": {
                      "type": "string"
                    },
                    "skipped": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "date",
                          "weekday",
                          "reasons"
                        ],
                        "properties": {
                          "date": {
                            "type": "string",
                            "format": "date"
                          },
                          "weekday": {
                            "type": "string"
                          },
                          "reasons": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          }
                        }
                      }
                    }
                  }
                }
              },
              "holidaysApplied": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "date",
                    "name",
                    "localName",
                    "scope"
                  ],
                  "properties": {
                    "date": {
                      "type": "string",
                      "format": "date"
                    },
                    "name": {
                      "type": "string"
                    },
                    "localName": {
                      "type": "string"
                    },
                    "scope": {
                      "type": "string"
                    }
                  }
                }
              },
              "dataRange": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "firstYear",
                  "lastYear"
                ],
                "properties": {
                  "firstYear": {
                    "type": "integer"
                  },
                  "lastYear": {
                    "type": "integer"
                  }
                }
              },
              "outsideDataRange": {
                "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"
              }
            }
          }
        }
      },
      "SafeMarkdownPreviewInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "markdown": {
            "title": "Markdown",
            "type": "string",
            "maxLength": 1000000
          },
          "file": {
            "title": "Or upload a Markdown file",
            "type": "object",
            "description": "Upload as {filename, contentType?, contentBase64}. Max 977 KiB. Accepts .md,.markdown,.txt,text/markdown,text/plain.",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "rawHtml": {
            "title": "Raw HTML in the Markdown",
            "type": "string",
            "enum": [
              "sanitize",
              "escape",
              "strip"
            ],
            "default": "sanitize"
          },
          "gfm": {
            "title": "GitHub extensions (tables, task lists, strikethrough, bare URLs)",
            "type": "boolean",
            "default": true
          },
          "footnotes": {
            "title": "Footnotes ([^1])",
            "type": "boolean",
            "default": true
          },
          "allowDataImages": {
            "title": "Allow base64 data: images (PNG/JPEG/GIF/WebP/AVIF; never SVG)",
            "type": "boolean",
            "default": false
          }
        },
        "required": []
      },
      "SafeMarkdownPreviewResult": {
        "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": [
              "html",
              "text",
              "removed",
              "removedCounts",
              "stats",
              "toc",
              "policy"
            ],
            "properties": {
              "html": {
                "type": "string",
                "description": "Sanitised HTML (allow-listed elements and attributes only)"
              },
              "text": {
                "type": "string"
              },
              "removed": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "kind",
                    "detail"
                  ],
                  "properties": {
                    "kind": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              },
              "removedCounts": {
                "type": "object",
                "additionalProperties": {
                  "type": "integer"
                }
              },
              "stats": {
                "type": "object",
                "additionalProperties": {
                  "type": "integer"
                }
              },
              "toc": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "level",
                    "text",
                    "id"
                  ],
                  "properties": {
                    "level": {
                      "type": "integer"
                    },
                    "text": {
                      "type": "string"
                    },
                    "id": {
                      "type": "string"
                    }
                  }
                }
              },
              "policy": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "rawHtml",
                  "gfm",
                  "footnotes",
                  "allowDataImages",
                  "allowedTags"
                ],
                "properties": {
                  "rawHtml": {
                    "type": "string"
                  },
                  "gfm": {
                    "type": "boolean"
                  },
                  "footnotes": {
                    "type": "boolean"
                  },
                  "allowDataImages": {
                    "type": "boolean"
                  },
                  "allowedTags": {
                    "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"
              }
            }
          }
        }
      },
      "TimefairInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "title": {
            "title": "Meeting title",
            "type": "string",
            "maxLength": 120,
            "default": "Team meeting"
          },
          "participants": {
            "title": "Participants",
            "description": "IANA time zone such as Europe/Berlin, America/New_York, Asia/Kolkata. Work end earlier than start means an overnight shift. The first participant is the organiser (date range uses their calendar).",
            "type": "array",
            "minItems": 2,
            "maxItems": 20,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "name": {
                  "title": "Name",
                  "type": "string",
                  "maxLength": 80
                },
                "timeZone": {
                  "title": "Time zone",
                  "type": "string",
                  "maxLength": 64
                },
                "workStart": {
                  "title": "Work start",
                  "type": "string",
                  "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
                  "default": "09:00"
                },
                "workEnd": {
                  "title": "Work end",
                  "type": "string",
                  "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
                  "default": "17:00"
                },
                "weight": {
                  "title": "Weight",
                  "type": "number",
                  "minimum": 0.1,
                  "maximum": 10,
                  "default": 1
                }
              },
              "required": [
                "name",
                "timeZone"
              ]
            }
          },
          "startDate": {
            "title": "First day",
            "description": "In the organiser’s time zone. Defaults to today (UTC date).",
            "type": "string",
            "format": "date"
          },
          "days": {
            "title": "Number of days",
            "type": "integer",
            "minimum": 1,
            "maximum": 14,
            "default": 5
          },
          "durationMinutes": {
            "title": "Meeting length",
            "type": "integer",
            "minimum": 15,
            "maximum": 480,
            "default": 60,
            "x-unit": "min"
          },
          "granularity": {
            "title": "Slot granularity",
            "type": "string",
            "enum": [
              "15",
              "30",
              "60"
            ],
            "default": "30"
          },
          "workdays": {
            "title": "Working days (local to each participant)",
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "sun",
                "mon",
                "tue",
                "wed",
                "thu",
                "fri",
                "sat"
              ]
            },
            "default": [
              "mon",
              "tue",
              "wed",
              "thu",
              "fri"
            ]
          },
          "recurrences": {
            "title": "Occurrences to rotate",
            "type": "integer",
            "minimum": 1,
            "maximum": 12,
            "default": 4
          },
          "intervalDays": {
            "title": "Repeat every",
            "type": "integer",
            "minimum": 1,
            "maximum": 28,
            "default": 7,
            "x-unit": "days"
          }
        },
        "required": [
          "participants"
        ]
      },
      "TimefairResult": {
        "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": [
              "organizerTimeZone",
              "rangeStartUtc",
              "rangeEndUtc",
              "durationMinutes",
              "granularityMinutes",
              "candidatesEvaluated",
              "participants",
              "bestSlots",
              "rotation",
              "rotationTotals",
              "chosen"
            ],
            "properties": {
              "organizerTimeZone": {
                "type": "string"
              },
              "rangeStartUtc": {
                "type": "string",
                "format": "date-time"
              },
              "rangeEndUtc": {
                "type": "string",
                "format": "date-time"
              },
              "durationMinutes": {
                "type": "integer"
              },
              "granularityMinutes": {
                "type": "integer"
              },
              "candidatesEvaluated": {
                "type": "integer",
                "minimum": 1
              },
              "participants": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "name",
                    "timeZone",
                    "workStart",
                    "workEnd",
                    "overnight",
                    "weight"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "timeZone": {
                      "type": "string"
                    },
                    "workStart": {
                      "type": "string"
                    },
                    "workEnd": {
                      "type": "string"
                    },
                    "overnight": {
                      "type": "boolean"
                    },
                    "weight": {
                      "type": "number"
                    }
                  }
                }
              },
              "bestSlots": {
                "type": "array",
                "minItems": 1,
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "rank",
                    "startUtc",
                    "endUtc",
                    "cost",
                    "totalInconvenience",
                    "maxInconvenience",
                    "stdDevInconvenience",
                    "local"
                  ],
                  "properties": {
                    "rank": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "startUtc": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "endUtc": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "cost": {
                      "type": "number",
                      "minimum": 0
                    },
                    "totalInconvenience": {
                      "type": "number",
                      "minimum": 0
                    },
                    "maxInconvenience": {
                      "type": "number",
                      "minimum": 0
                    },
                    "stdDevInconvenience": {
                      "type": "number",
                      "minimum": 0
                    },
                    "local": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "name",
                          "timeZone",
                          "localStart",
                          "localEnd",
                          "utcOffset",
                          "weekday",
                          "inconvenience",
                          "outsideMinutes",
                          "nightMinutes"
                        ],
                        "properties": {
                          "name": {
                            "type": "string"
                          },
                          "timeZone": {
                            "type": "string"
                          },
                          "localStart": {
                            "type": "string",
                            "description": "Local wall time YYYY-MM-DDTHH:MM"
                          },
                          "localEnd": {
                            "type": "string"
                          },
                          "utcOffset": {
                            "type": "string",
                            "pattern": "^[+-]\\d{2}:\\d{2}$"
                          },
                          "weekday": {
                            "type": "string"
                          },
                          "inconvenience": {
                            "type": "number",
                            "minimum": 0
                          },
                          "outsideMinutes": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "nightMinutes": {
                            "type": "integer",
                            "minimum": 0
                          }
                        }
                      }
                    }
                  }
                }
              },
              "rotation": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "occurrence",
                    "startUtc",
                    "endUtc",
                    "local",
                    "cumulative"
                  ],
                  "properties": {
                    "occurrence": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "startUtc": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "endUtc": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "local": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "name",
                          "timeZone",
                          "localStart",
                          "localEnd",
                          "utcOffset",
                          "weekday",
                          "inconvenience",
                          "outsideMinutes",
                          "nightMinutes"
                        ],
                        "properties": {
                          "name": {
                            "type": "string"
                          },
                          "timeZone": {
                            "type": "string"
                          },
                          "localStart": {
                            "type": "string",
                            "description": "Local wall time YYYY-MM-DDTHH:MM"
                          },
                          "localEnd": {
                            "type": "string"
                          },
                          "utcOffset": {
                            "type": "string",
                            "pattern": "^[+-]\\d{2}:\\d{2}$"
                          },
                          "weekday": {
                            "type": "string"
                          },
                          "inconvenience": {
                            "type": "number",
                            "minimum": 0
                          },
                          "outsideMinutes": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "nightMinutes": {
                            "type": "integer",
                            "minimum": 0
                          }
                        }
                      }
                    },
                    "cumulative": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "name",
                          "total"
                        ],
                        "properties": {
                          "name": {
                            "type": "string"
                          },
                          "total": {
                            "type": "number"
                          }
                        }
                      }
                    }
                  }
                }
              },
              "rotationTotals": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "name",
                    "total"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "total": {
                      "type": "number"
                    }
                  }
                }
              },
              "chosen": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "startUtc",
                  "endUtc"
                ],
                "properties": {
                  "startUtc": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "endUtc": {
                    "type": "string",
                    "format": "date-time"
                  }
                }
              }
            }
          },
          "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"
              }
            }
          }
        }
      },
      "UnitproofInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "expression": {
            "title": "Expression",
            "description": "Numbers, units with SI prefixes, ^ powers, * / + − and parentheses; optional \"to\"/\"in\" target. Juxtaposition (e.g. \"2 h\") binds tighter than * and /. Bare C/F mean °C/°F.",
            "type": "string",
            "maxLength": 300
          },
          "significantDigits": {
            "title": "Significant digits (rounded value)",
            "type": "integer",
            "minimum": 1,
            "maximum": 15,
            "default": 6
          }
        },
        "required": [
          "expression"
        ]
      },
      "UnitproofResult": {
        "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": [
              "expression",
              "value",
              "valueRounded",
              "significantDigits",
              "unit",
              "target",
              "valueSI",
              "unitSI",
              "dimension",
              "quantity",
              "dimensionCheck",
              "temperature",
              "alternatives",
              "derivation",
              "unitsUsed"
            ],
            "properties": {
              "expression": {
                "type": "string"
              },
              "value": {
                "type": "number",
                "description": "Unrounded IEEE-754 double result in the output unit."
              },
              "valueRounded": {
                "type": "number"
              },
              "significantDigits": {
                "type": "integer",
                "minimum": 1,
                "maximum": 15
              },
              "unit": {
                "type": "string"
              },
              "target": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "valueSI": {
                "type": "number",
                "description": "Value in coherent SI units (kelvin for temperatures)."
              },
              "unitSI": {
                "type": "string"
              },
              "dimension": {
                "type": "string"
              },
              "quantity": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "dimensionCheck": {
                "type": "string",
                "enum": [
                  "ok"
                ]
              },
              "temperature": {
                "type": "string",
                "enum": [
                  "absolute",
                  "interval",
                  "none"
                ]
              },
              "alternatives": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "unit",
                    "value"
                  ],
                  "properties": {
                    "unit": {
                      "type": "string"
                    },
                    "value": {
                      "type": "number"
                    }
                  }
                }
              },
              "derivation": {
                "type": "array",
                "minItems": 2,
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "id",
                    "kind",
                    "label",
                    "value",
                    "unit",
                    "dimension",
                    "children",
                    "note"
                  ],
                  "properties": {
                    "id": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "kind": {
                      "type": "string",
                      "enum": [
                        "literal",
                        "unit",
                        "operation",
                        "conversion",
                        "result"
                      ]
                    },
                    "label": {
                      "type": "string"
                    },
                    "value": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "unit": {
                      "type": "string"
                    },
                    "dimension": {
                      "type": "string"
                    },
                    "children": {
                      "type": "array",
                      "items": {
                        "type": "integer",
                        "minimum": 0
                      }
                    },
                    "note": {
                      "type": "string"
                    }
                  }
                }
              },
              "unitsUsed": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "symbol",
                    "name",
                    "definition",
                    "exact",
                    "source"
                  ],
                  "properties": {
                    "symbol": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    },
                    "definition": {
                      "type": "string"
                    },
                    "exact": {
                      "type": "boolean"
                    },
                    "source": {
                      "type": "string",
                      "enum": [
                        "SI",
                        "NIST811",
                        "definition"
                      ]
                    }
                  }
                }
              }
            }
          },
          "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"
              }
            }
          }
        }
      },
      "UnixPermissionCalculatorInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "mode": {
            "title": "Mode",
            "description": "Octal (644, 0755, 4755), symbolic (rwxr-xr-x) or an ls -l string (drwxr-sr-x, -rw-r--r--@).",
            "type": "string",
            "maxLength": 200
          },
          "chmod": {
            "title": "chmod expression to apply (optional)",
            "description": "Symbolic clauses (u+x, go-w, a=rX, g=u, u+s, +t) or a numeric mode, applied to the mode above.",
            "type": "string",
            "maxLength": 200
          },
          "isDirectory": {
            "title": "It is a directory",
            "description": "Affects X, the meaning of r/w/x and GNU's handling of setuid/setgid on directories. ls -l strings starting with d set this automatically.",
            "type": "boolean",
            "default": false
          },
          "umask": {
            "title": "umask (optional)",
            "description": "Shows the default modes for new files (666 & ~umask) and directories (777 & ~umask).",
            "type": "string",
            "maxLength": 5
          }
        },
        "required": [
          "mode"
        ]
      },
      "UnixPermissionCalculatorResult": {
        "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": [
              "input",
              "inputFormat",
              "isDirectory",
              "fileType",
              "octal",
              "symbolic",
              "lsString",
              "special",
              "chmod",
              "umask"
            ],
            "properties": {
              "input": {
                "type": "string"
              },
              "inputFormat": {
                "type": "string",
                "enum": [
                  "octal",
                  "symbolic",
                  "ls"
                ]
              },
              "isDirectory": {
                "type": "boolean"
              },
              "fileType": {
                "type": "string"
              },
              "octal": {
                "type": "string",
                "description": "Final mode (after chmod, if given) as 4-digit octal."
              },
              "symbolic": {
                "type": "string"
              },
              "lsString": {
                "type": "string"
              },
              "special": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "setuid",
                  "setgid",
                  "sticky"
                ],
                "properties": {
                  "setuid": {
                    "type": "boolean"
                  },
                  "setgid": {
                    "type": "boolean"
                  },
                  "sticky": {
                    "type": "boolean"
                  }
                }
              },
              "chmod": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "expression",
                  "baseOctal",
                  "resultOctal",
                  "steps",
                  "command"
                ],
                "properties": {
                  "expression": {
                    "type": "string"
                  },
                  "baseOctal": {
                    "type": "string"
                  },
                  "resultOctal": {
                    "type": "string"
                  },
                  "command": {
                    "type": "string"
                  },
                  "steps": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "clause",
                        "before",
                        "after"
                      ],
                      "properties": {
                        "clause": {
                          "type": "string"
                        },
                        "before": {
                          "type": "string"
                        },
                        "after": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              },
              "umask": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "umask",
                  "fileDefault",
                  "directoryDefault"
                ],
                "properties": {
                  "umask": {
                    "type": "string"
                  },
                  "fileDefault": {
                    "type": "string"
                  },
                  "directoryDefault": {
                    "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"
              }
            }
          }
        }
      }
    }
  }
}