{
  "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.site"
    }
  ],
  "paths": {
    "/api/v1/tools": {
      "get": {
        "operationId": "listTools",
        "summary": "Catalog of all tools",
        "responses": {
          "200": {
            "description": "Tool list.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/{id}": {
      "get": {
        "operationId": "getTool",
        "summary": "Definition of one tool",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "headerlens",
                "a11y-snapshot",
                "citeshape",
                "datafresh",
                "filefit",
                "localekit",
                "ruledate",
                "timefair",
                "unitproof"
              ]
            }
          }
        ],
        "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/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/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/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/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/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/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"
              }
            }
          }
        }
      },
      "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"
              }
            }
          }
        }
      },
      "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"
              }
            }
          }
        }
      },
      "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"
              }
            }
          }
        }
      },
      "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"
              }
            }
          }
        }
      },
      "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"
              }
            }
          }
        }
      }
    }
  }
}