{
  "openapi": "3.1.1",
  "info": {
    "title": "Contracts, safety & accessibility 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://highvalue.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": [
                "accessibility-fixer",
                "before-you-sign",
                "digital-estate-organizer",
                "disaster-prep-builder",
                "compatibility-engine",
                "what-changed-in-this-law"
              ]
            }
          }
        ],
        "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/accessibility-fixer/calculate": {
      "post": {
        "operationId": "calculateAccessibilityFixer",
        "summary": "Turn WCAG 2.2 problems in your HTML into concrete code fixes, grouped by effort.",
        "description": "Paste HTML or enter a URL and get a fix list: for every detected accessibility problem the tool shows the offending element, a corrected version generated from it (alt text, labels, lang, names, heading levels, table headers…) and how much work it is. Placeholders that need human judgement are marked TODO, and a patch-style diff is included.\n\nMethodology:\n- Runs the same static rule set as Accessibility Snapshot (WCAG 2.2 mapping verified against the W3C Recommendation).\n- Each fix is generated from the actual element: the original start tag is re-serialised with the needed attribute added, changed or removed (e.g. alt, aria-label, lang, id + <label for>, th scope, tabindex).\n- Text the tool cannot know — what an image shows, what a field means, the page language — is never guessed: it is inserted as a TODO placeholder (lang=\"en\" is only a placeholder).\n- Fixes are grouped by effort: quick = attribute change, moderate = markup change that may affect styling, involved = structural or content work.\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": [
          "high-value"
        ],
        "x-mcp-tool": "accessibility_fixer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccessibilityFixerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Checkout form with missing labels and alt text",
                  "value": {
                    "html": "<html>\n<head><title>Shop</title></head>\n<body>\n<header><a href=\"/\"><img src=\"/img/logo.svg\"></a></header>\n<main>\n<h1>Checkout</h1>\n<h4>Delivery address</h4>\n<form action=\"/pay\">\n  <input type=\"text\" name=\"fullname\" placeholder=\"Full name\">\n  <select name=\"country\"><option>Germany</option><option>France</option></select>\n  <button type=\"submit\"><i class=\"icon-arrow\"></i></button>\n</form>\n<img src=\"/img/IMG_2041.jpg\" alt=\"IMG_2041.jpg\">\n</main>\n</body>\n</html>",
                    "includeBestPractice": true,
                    "maxFixes": 80
                  }
                },
                "example2": {
                  "summary": "Pricing table, autoplay video and fake button",
                  "value": {
                    "html": "<!doctype html><html lang=\"de\"><head><title>Preise</title></head><body><main id=\"main\">\n<h1>Preise</h1>\n<table><tr><td>Tarif</td><td>Preis</td></tr><tr><td>Basis</td><td>9 €</td></tr><tr><td>Pro</td><td>19 €</td></tr></table>\n<video src=\"/promo.mp4\" autoplay></video>\n<div role=\"button\" class=\"buy\">Jetzt kaufen</div>\n</main></body></html>",
                    "includeBestPractice": false,
                    "maxFixes": 40
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccessibilityFixerResult"
                }
              }
            }
          },
          "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/before-you-sign/calculate": {
      "post": {
        "operationId": "calculateBeforeYouSign",
        "summary": "Spot risky contract clauses (renewal, notice, liability, non-compete…) before you sign.",
        "description": "Paste, upload or link a contract, terms of service, lease or employment agreement in English or German. Before You Sign flags 19 kinds of clauses — auto-renewal, notice periods, minimum terms, termination fees, liability limits, indemnities, arbitration, non-competes, IP assignment, price escalation, penalties, guarantees, data sharing and unilateral changes — quotes each clause, extracts durations and amounts, and lists questions to ask.\n\nMethodology:\n- The contract is split into sentences (numbered clauses, bullets and § headings start new units).\n- Each sentence is tested against 19 clause categories, each with English and German regular-expression patterns (e.g. \"automatically renew\", \"verlängert sich stillschweigend\", \"Kündigungsfrist\", \"Vertragsstrafe\", \"hold harmless\").\n- Parameters are extracted from the matched sentence: durations (numbers or number words, incl. \"three months\"/\"drei Monate\"), percentages, money amounts, radius (km/miles), governing law and court venue.\n- Severity comes from a fixed, documented rule per category (e.g. notice period ≥ 3 months = high; non-compete ≥ 12 months or ≥ 50 km = high). It signals how much attention a clause deserves, not whether it is legal or enforceable.\n- Each category has fixed questions to ask before signing. Categories without any match are listed as \"not detected\" — absence of a match is not proof the clause is absent.\n\nNot legal advice. This is an automated, rule-based text analysis that can miss or misread clauses; it never claims completeness. For decisions with legal or financial consequences, ask a qualified professional (e.g. a lawyer, tax adviser or consumer advice centre).",
        "tags": [
          "high-value"
        ],
        "x-mcp-tool": "before_you_sign",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BeforeYouSignInput"
              },
              "examples": {
                "example1": {
                  "summary": "SaaS subscription terms (English)",
                  "value": {
                    "text": "1. Term. The initial term of this Agreement is 24 months. Thereafter, this Agreement shall automatically renew for successive 12-month periods unless either party provides at least 90 days' prior written notice of non-renewal.\n2. Fees. Provider may increase the fees at any time at its sole discretion. Overdue amounts bear interest at 1.5% per month.\n3. Early termination. If Customer terminates before the end of the initial term, all remaining fees for the term become immediately due.\n4. Liability. In no event shall Provider be liable for any indirect or consequential damages; Provider's aggregate liability is limited to the fees paid in the last 3 months.\n5. Customer shall indemnify and hold harmless Provider from any and all claims arising from Customer's use of the service.\n6. Disputes. Any dispute shall be resolved by binding arbitration, and Customer waives any right to participate in a class action. This Agreement is governed by the laws of the State of Delaware.\n7. Provider reserves the right to modify these terms at any time; continued use constitutes acceptance."
                  }
                },
                "example2": {
                  "summary": "Arbeitsvertrag mit Wettbewerbsverbot (Deutsch)",
                  "value": {
                    "text": "§ 2 Vertragsdauer\nDas Arbeitsverhältnis wird auf unbestimmte Zeit geschlossen. Die Kündigungsfrist beträgt drei Monate zum Quartalsende.\n§ 7 Wettbewerbsverbot\nDer Arbeitnehmer verpflichtet sich, für die Dauer von 24 Monaten nach Beendigung des Arbeitsverhältnisses in einem Umkreis von 100 km nicht für ein Konkurrenzunternehmen tätig zu werden. Für jeden Fall der Zuwiderhandlung ist eine Vertragsstrafe in Höhe von 10.000 EUR zu zahlen.\n§ 8 Verschwiegenheit\nDer Arbeitnehmer ist verpflichtet, über alle Betriebsgeheimnisse auch nach Beendigung des Arbeitsverhältnisses zeitlich unbegrenzt Stillschweigen zu bewahren.\n§ 9 Arbeitsergebnisse\nDer Arbeitnehmer überträgt dem Arbeitgeber sämtliche Nutzungsrechte an allen Arbeitsergebnissen zeitlich und räumlich unbeschränkt.\n§ 12 Schlussbestimmungen\nEs gilt deutsches Recht. Gerichtsstand ist München."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BeforeYouSignResult"
                }
              }
            }
          },
          "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/digital-estate-organizer/calculate": {
      "post": {
        "operationId": "calculateDigitalEstateOrganizer",
        "summary": "List your online accounts and get a prioritised plan for what happens to them – no passwords needed.",
        "description": "Inventory email, cloud, social, financial, crypto and subscription accounts, choose what should happen to each (transfer, download then delete, memorialise, delete, keep running), and get a prioritised plan that uses the providers' official legacy features (Google Inactive Account Manager, Apple Legacy Contact, Facebook legacy contact, Bitwarden Emergency Access…) plus a printable handover document. Passwords are refused and nothing is stored.\n\nMethodology:\n- Priority order: password manager → email (it resets everything else) → banking/crypto → domains → cloud data → subscriptions/work → social → shopping → other; ties keep your order.\n- Services are matched against a small, sourced list of official legacy features (Google, Apple, Meta, Bitwarden); unmatched services get category-based steps.\n- Input that looks like a password, PIN or seed phrase is rejected; nothing is stored on the server.\n\nThis is an organisational checklist, not legal advice and not a will. Inheritance law differs by country; store the generated document with your will and tell your executor where it is.",
        "tags": [
          "high-value"
        ],
        "x-mcp-tool": "digital_estate_organizer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalEstateOrganizerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Typical household",
                  "value": {
                    "ownerName": "Alex Example",
                    "trustedContact": "Sam Example",
                    "hasPasswordManager": true,
                    "hasWrittenWill": false,
                    "accounts": [
                      {
                        "service": "Gmail",
                        "category": "email",
                        "wish": "transfer",
                        "recoveryEmail": "alex.backup@example.org"
                      },
                      {
                        "service": "iCloud Photos",
                        "category": "cloud-photos",
                        "wish": "download-then-delete",
                        "monthlyCost": 2.99
                      },
                      {
                        "service": "Facebook",
                        "category": "social",
                        "wish": "memorialize"
                      },
                      {
                        "service": "Bitwarden",
                        "category": "password-manager",
                        "wish": "transfer"
                      },
                      {
                        "service": "Netflix",
                        "category": "subscription",
                        "wish": "delete",
                        "monthlyCost": 13.99
                      },
                      {
                        "service": "example-family.org",
                        "category": "domain-website",
                        "wish": "keep-running",
                        "monthlyCost": 1.5
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalEstateOrganizerResult"
                }
              }
            }
          },
          "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/disaster-prep-builder/calculate": {
      "post": {
        "operationId": "calculateDisasterPrepBuilder",
        "summary": "Build an emergency supply list for your household from official Ready.gov or BBK guidance.",
        "description": "Enter your household (adults, children, infants, pets), the number of days and the hazards you face. The tool calculates water and food quantities from the official guideline you choose (Ready.gov in the US or the German BBK), builds a grouped checklist with hazard-specific additions quoted from the sources, and estimates cost only if you enter your own prices.\n\nMethodology:\n- Ready.gov: water = 1 US gallon (3.785 L) per person per day \"for several days, for drinking and sanitation\". Ready.gov names no fixed number of days; this tool defaults to 3 days unless you enter another value.\n- BBK: water = 2 liters per person per day (0.5 L of it for cooking); default 10 days (\"möglichst 10 Tage\"), with 3 days as a useful first step.\n- Water total = (adults + children + infants) × liters per person per day × days. Heat selected: an upper figure of 2 × that amount is shown (Ready.gov: \"In very hot temperatures, water needs can double\").\n- Food energy = (adults × kcal per adult + children × kcal per child) × days. Defaults: 2,200 kcal per adult (basis of the German BLE stock calculator) and 1,500 kcal per child (tool assumption).\n- Counted items: flashlights = number of people (Ready.gov: \"flashlights for every household member\"); sleeping bag or warm blanket for each person (Ready.gov); spare battery sets = flashlights + 1 radio (tool assumption).\n- Checklist groups and hazard additions are quoted from the chosen guideline and the Ready.gov hazard pages; items without a quantity in the source are listed without one.\n- Cost = quantity × your unit price, only for items you price; no prices are assumed.\n\nFollow instructions from local authorities. Medical and infant needs vary; ask your doctor or pharmacist.",
        "tags": [
          "high-value"
        ],
        "x-mcp-tool": "disaster_prep_builder",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DisasterPrepBuilderInput"
              },
              "examples": {
                "example1": {
                  "summary": "US family of four, power outage + winter storm",
                  "value": {
                    "guideline": "readygov",
                    "adults": 2,
                    "children": 2,
                    "dogs": 1,
                    "hazards": [
                      "power-outage",
                      "winter-storm"
                    ],
                    "currency": "USD"
                  }
                },
                "example2": {
                  "summary": "German couple with infant, 10 days, with prices",
                  "value": {
                    "guideline": "bbk",
                    "adults": 2,
                    "infants": 1,
                    "hazards": [
                      "power-outage",
                      "flood",
                      "heat"
                    ],
                    "medicalNeeds": true,
                    "currency": "EUR",
                    "budget": 150,
                    "unitPrices": [
                      {
                        "item": "water-liter",
                        "price": 0.3
                      },
                      {
                        "item": "food-1000kcal",
                        "price": 1.2
                      },
                      {
                        "item": "flashlight",
                        "price": 8
                      },
                      {
                        "item": "radio",
                        "price": 25
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DisasterPrepBuilderResult"
                }
              }
            }
          },
          "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/compatibility-engine/calculate": {
      "post": {
        "operationId": "calculateCompatibilityEngine",
        "summary": "Will this charger, cable, version or PC part work together? Rule-based checks with margins.",
        "description": "Three deterministic checks: (1) USB-C charging – the real maximum power from charger, cable and device per the USB Power Delivery rules; (2) software versions – whether versions satisfy an npm-style semver range (^, ~, x-ranges, hyphen ranges, ||); (3) PC builds – CPU socket, RAM generation, slots and power-supply headroom.\n\nMethodology:\n- Charging: with USB PD on both sides the standard power range allows 5/9/15/20 V at 3 A (≤ 60 W with a standard cable) and 20 V at 5 A (≤ 100 W) with a 5 A e-marked cable; above 100 W (28/36/48 V, ≤ 240 W) needs charger, device AND cable to support PD 3.1 EPR. Without PD on both sides the assumed ceiling is USB-C 5 V / 3 A = 15 W. Expected maximum = minimum of charger, device and that limit.\n- Semver: npm range semantics (^ caret, ~ tilde, x-ranges, hyphen ranges, || alternatives, comparator sets); prereleases only match ranges that mention a prerelease of the same version.\n- PC: sockets must match exactly (case-insensitive); RAM generation must match; modules ≤ slots; recommended PSU = (CPU + GPU + other) × (1 + headroom%).",
        "tags": [
          "high-value"
        ],
        "x-mcp-tool": "compatibility_engine",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompatibilityEngineInput"
              },
              "examples": {
                "example1": {
                  "summary": "140 W laptop on a 100 W charger",
                  "value": {
                    "mode": "charging",
                    "chargerW": 100,
                    "chargerPd": true,
                    "deviceW": 140,
                    "devicePd": true,
                    "deviceEpr": true,
                    "cable": "usb-c-3a"
                  }
                },
                "example2": {
                  "summary": "Node.js engine range",
                  "value": {
                    "mode": "semver",
                    "range": "^18.17.0 || >=20.5.0",
                    "versions": [
                      "18.16.1",
                      "18.20.4",
                      "20.4.0",
                      "20.11.1",
                      "22.0.0-rc.1",
                      "22.1.0"
                    ]
                  }
                },
                "example3": {
                  "summary": "AM5 gaming PC",
                  "value": {
                    "mode": "pc",
                    "cpuSocket": "AM5",
                    "boardSocket": "AM5",
                    "ramType": "DDR5",
                    "boardRamType": "DDR5",
                    "ramModules": 2,
                    "boardSlots": 4,
                    "cpuW": 120,
                    "gpuW": 285,
                    "otherW": 75,
                    "psuW": 650
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompatibilityEngineResult"
                }
              }
            }
          },
          "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/what-changed-in-this-law/calculate": {
      "post": {
        "operationId": "calculateWhatChangedInThisLaw",
        "summary": "Compare two versions of a law or regulation section by section, with changed numbers and deadlines.",
        "description": "Paste (or link) the old and new versions of a law, regulation, terms of service or policy. The text is split at §, Art. and Section headings, sections are aligned by their number, and every added, removed or modified section is shown with a word-level diff and the numbers, durations and obligation words (must/may/muss/kann…) that changed.\n\nMethodology:\n- Sections start at lines beginning with §, Art./Artikel/Article, Section/Sec. or Paragraph followed by a number; text before the first heading is the preamble.\n- Sections are aligned by their normalised number (LCS over section ids), so renumbered sections show as removed + added.\n- Inside a changed section a word-level LCS diff is computed; numbers, money amounts, percentages, durations and obligation words (must/shall/may, muss/kann/soll/darf…) present in only one version are listed.\n- Whitespace-only differences are ignored.\n\nNot legal advice. This is an automated, rule-based text analysis that can miss or misread clauses; it never claims completeness. For decisions with legal or financial consequences, ask a qualified professional (e.g. a lawyer, tax adviser or consumer advice centre). Always check the official consolidated text and the amending act for transitional provisions.",
        "tags": [
          "high-value"
        ],
        "x-mcp-tool": "what_changed_in_this_law",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WhatChangedInThisLawInput"
              },
              "examples": {
                "example1": {
                  "summary": "Notice period shortened",
                  "value": {
                    "oldText": "§ 1 Scope\nThis act applies to consumer contracts.\n§ 2 Notice\nThe customer must give notice of termination at least 3 months before the end of the term.\n§ 3 Fees\nA processing fee of 25 EUR may be charged.",
                    "newText": "§ 1 Scope\nThis act applies to consumer contracts.\n§ 2 Notice\nThe customer may give notice of termination at any time with a notice period of 1 month.\n§ 3 Fees\nA processing fee of 25 EUR may be charged.\n§ 4 Online cancellation\nProviders must offer a cancellation button on their website.",
                    "citation": "Example amendment act",
                    "effectiveDate": "2026-12-01"
                  }
                },
                "example2": {
                  "summary": "German: Frist geändert",
                  "value": {
                    "oldText": "§ 5 Frist\nDer Antrag ist innerhalb von 14 Tagen zu stellen.\n§ 6 Gebühr\nDie Gebühr beträgt 50 Euro.",
                    "newText": "§ 5 Frist\nDer Antrag ist innerhalb von 30 Tagen zu stellen.\n§ 6 Gebühr\nDie Gebühr beträgt 50 Euro."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WhatChangedInThisLawResult"
                }
              }
            }
          },
          "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"
                }
              }
            }
          }
        }
      },
      "AccessibilityFixerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "url": {
            "title": "Page URL",
            "description": "Static HTML only; JavaScript is not executed.",
            "type": "string",
            "format": "uri"
          },
          "html": {
            "title": "Or paste HTML",
            "description": "Takes precedence over the URL.",
            "type": "string",
            "maxLength": 500000
          },
          "includeBestPractice": {
            "title": "Include best-practice and review items",
            "type": "boolean",
            "default": true
          },
          "maxFixes": {
            "title": "Max fixes",
            "type": "integer",
            "minimum": 5,
            "maximum": 300,
            "default": 80
          }
        },
        "required": []
      },
      "AccessibilityFixerResult": {
        "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",
              "totalFixes",
              "byEffort",
              "needsHumanInput",
              "fixes",
              "truncated",
              "patch",
              "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"
                  }
                }
              },
              "totalFixes": {
                "type": "integer"
              },
              "byEffort": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "quick",
                  "moderate",
                  "involved"
                ],
                "properties": {
                  "quick": {
                    "type": "integer"
                  },
                  "moderate": {
                    "type": "integer"
                  },
                  "involved": {
                    "type": "integer"
                  }
                }
              },
              "needsHumanInput": {
                "type": "integer",
                "description": "Fixes that contain TODO placeholders (e.g. alt text, label wording, language code)."
              },
              "fixes": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "id",
                    "ruleId",
                    "wcag",
                    "kind",
                    "severity",
                    "effort",
                    "line",
                    "selector",
                    "problem",
                    "description",
                    "before",
                    "after",
                    "needsHumanInput"
                  ],
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "ruleId": {
                      "type": "string"
                    },
                    "wcag": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "kind": {
                      "type": "string",
                      "enum": [
                        "failure",
                        "best-practice",
                        "needs-review"
                      ]
                    },
                    "severity": {
                      "type": "string",
                      "enum": [
                        "critical",
                        "serious",
                        "moderate",
                        "minor"
                      ]
                    },
                    "effort": {
                      "type": "string",
                      "enum": [
                        "quick",
                        "moderate",
                        "involved"
                      ]
                    },
                    "line": {
                      "type": "integer",
                      "minimum": 1
                    },
                    "selector": {
                      "type": "string"
                    },
                    "problem": {
                      "type": "string"
                    },
                    "description": {
                      "type": "string"
                    },
                    "before": {
                      "type": "string"
                    },
                    "after": {
                      "type": "string"
                    },
                    "needsHumanInput": {
                      "type": "boolean"
                    }
                  }
                }
              },
              "truncated": {
                "type": "boolean"
              },
              "patch": {
                "type": "string",
                "description": "Unified-diff style suggestion list keyed by source line."
              },
              "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"
              }
            }
          }
        }
      },
      "BeforeYouSignInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "text": {
            "title": "Contract text",
            "description": "Paste the text here, or use one of the other options below (exactly one).",
            "type": "string",
            "maxLength": 200000
          },
          "file": {
            "title": "Or upload a file",
            "description": "TXT, PDF, DOCX, HTML or a photo/scan (PNG/JPG, read with OCR). Max 5 MiB. Upload as {filename, contentType?, contentBase64}. Max 5120 KiB. Accepts .txt,.pdf,.docx,.png,.jpg,.jpeg,.html.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "url": {
            "title": "Or fetch public terms from a URL",
            "description": "A public http(s) address. The page text is fetched once and analysed.",
            "type": "string",
            "format": "uri"
          }
        },
        "required": []
      },
      "BeforeYouSignResult": {
        "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": [
              "disclaimer",
              "confidence",
              "counts",
              "findings",
              "categoriesFound",
              "notDetected"
            ],
            "properties": {
              "disclaimer": {
                "type": "string"
              },
              "confidence": {
                "type": "string",
                "const": "pattern-match"
              },
              "counts": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "high",
                  "medium",
                  "low",
                  "total",
                  "sentences"
                ],
                "properties": {
                  "high": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "medium": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "low": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "total": {
                    "type": "integer",
                    "minimum": 0
                  },
                  "sentences": {
                    "type": "integer",
                    "minimum": 0
                  }
                }
              },
              "findings": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "category",
                    "label",
                    "severity",
                    "severityRule",
                    "rule",
                    "clause",
                    "parameters",
                    "questions"
                  ],
                  "properties": {
                    "category": {
                      "type": "string",
                      "enum": [
                        "auto-renewal",
                        "notice-period",
                        "minimum-term",
                        "termination-rights",
                        "early-termination-fee",
                        "liability-limitation",
                        "indemnification",
                        "arbitration",
                        "governing-law",
                        "non-compete",
                        "confidentiality",
                        "ip-assignment",
                        "price-changes",
                        "late-payment-interest",
                        "penalties",
                        "personal-guarantee",
                        "exclusivity",
                        "data-sharing",
                        "unilateral-changes"
                      ]
                    },
                    "label": {
                      "type": "string"
                    },
                    "severity": {
                      "type": "string",
                      "enum": [
                        "high",
                        "medium",
                        "low"
                      ]
                    },
                    "severityRule": {
                      "type": "string",
                      "description": "The fixed rule that determined the severity."
                    },
                    "rule": {
                      "type": "string",
                      "description": "Id of the text pattern that matched."
                    },
                    "clause": {
                      "type": "string",
                      "description": "Exact sentence quoted from the contract."
                    },
                    "parameters": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "name",
                          "value"
                        ],
                        "properties": {
                          "name": {
                            "type": "string"
                          },
                          "value": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "questions": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              },
              "categoriesFound": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "notDetected": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Clause categories no pattern matched (they may still exist in other wording)."
              }
            }
          },
          "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"
              }
            }
          }
        }
      },
      "DigitalEstateOrganizerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "ownerName": {
            "title": "Your name (optional, for the document)",
            "type": "string",
            "maxLength": 120
          },
          "trustedContact": {
            "title": "Trusted contact / executor",
            "type": "string",
            "maxLength": 120
          },
          "accounts": {
            "title": "Accounts",
            "type": "array",
            "minItems": 1,
            "maxItems": 100,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "service": {
                  "title": "Service",
                  "type": "string",
                  "maxLength": 80
                },
                "category": {
                  "title": "Category",
                  "type": "string",
                  "enum": [
                    "email",
                    "cloud-photos",
                    "social",
                    "password-manager",
                    "banking",
                    "crypto",
                    "subscription",
                    "shopping",
                    "work",
                    "domain-website",
                    "other"
                  ],
                  "default": "other"
                },
                "wish": {
                  "title": "What should happen?",
                  "type": "string",
                  "enum": [
                    "transfer",
                    "download-then-delete",
                    "memorialize",
                    "delete",
                    "keep-running"
                  ],
                  "default": "download-then-delete"
                },
                "monthlyCost": {
                  "title": "Monthly cost",
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100000
                },
                "recoveryEmail": {
                  "title": "Recovery email (not password)",
                  "type": "string",
                  "maxLength": 120
                }
              },
              "required": [
                "service",
                "category",
                "wish"
              ]
            }
          },
          "hasPasswordManager": {
            "title": "I use a password manager",
            "type": "boolean",
            "default": false
          },
          "hasWrittenWill": {
            "title": "I have a written will",
            "type": "boolean",
            "default": false
          }
        },
        "required": [
          "trustedContact"
        ]
      },
      "DigitalEstateOrganizerResult": {
        "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": [
              "trustedContact",
              "accounts",
              "recurringMonthlyCost",
              "generalActions",
              "document"
            ],
            "properties": {
              "trustedContact": {
                "type": "string"
              },
              "recurringMonthlyCost": {
                "type": "number"
              },
              "generalActions": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "document": {
                "type": "string",
                "description": "Markdown handover document"
              },
              "accounts": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "priority",
                    "service",
                    "category",
                    "wish",
                    "legacyFeature",
                    "steps",
                    "monthlyCost"
                  ],
                  "properties": {
                    "priority": {
                      "type": "integer"
                    },
                    "service": {
                      "type": "string"
                    },
                    "category": {
                      "type": "string"
                    },
                    "wish": {
                      "type": "string"
                    },
                    "monthlyCost": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "legacyFeature": {
                      "type": [
                        "object",
                        "null"
                      ],
                      "additionalProperties": false,
                      "required": [
                        "name",
                        "how",
                        "url"
                      ],
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "how": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        }
                      }
                    },
                    "steps": {
                      "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"
              }
            }
          }
        }
      },
      "DisasterPrepBuilderInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "guideline": {
            "title": "Guideline",
            "type": "string",
            "enum": [
              "readygov",
              "bbk"
            ],
            "default": "readygov"
          },
          "adults": {
            "title": "Adults (and teenagers)",
            "type": "integer",
            "minimum": 0,
            "maximum": 50,
            "default": 2
          },
          "children": {
            "title": "Children",
            "type": "integer",
            "minimum": 0,
            "maximum": 50,
            "default": 0
          },
          "infants": {
            "title": "Infants",
            "type": "integer",
            "minimum": 0,
            "maximum": 20,
            "default": 0
          },
          "dogs": {
            "title": "Dogs",
            "type": "integer",
            "minimum": 0,
            "maximum": 20,
            "default": 0
          },
          "cats": {
            "title": "Cats",
            "type": "integer",
            "minimum": 0,
            "maximum": 20,
            "default": 0
          },
          "days": {
            "title": "Days of supply",
            "description": "Empty = guideline default (BBK: 10 days; Ready.gov says \"several days\", this tool uses 3).",
            "type": "integer",
            "minimum": 1,
            "maximum": 90,
            "x-unit": "days"
          },
          "hazards": {
            "title": "Hazards to prepare for",
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "power-outage",
                "flood",
                "heat",
                "winter-storm",
                "earthquake",
                "wildfire",
                "pandemic"
              ]
            },
            "default": [
              "power-outage"
            ]
          },
          "medicalNeeds": {
            "title": "Someone needs regular medication or medical devices",
            "type": "boolean",
            "default": false
          },
          "kcalPerAdultDay": {
            "title": "Food energy per adult per day",
            "description": "2,200 kcal is the basis of the German BLE stock calculator; Ready.gov gives no calorie figure.",
            "type": "number",
            "minimum": 500,
            "maximum": 6000,
            "default": 2200,
            "x-unit": "kcal"
          },
          "kcalPerChildDay": {
            "title": "Food energy per child per day",
            "description": "Tool assumption; adjust to your children's ages.",
            "type": "number",
            "minimum": 300,
            "maximum": 4000,
            "default": 1500,
            "x-unit": "kcal"
          },
          "dogWaterLitersPerDay": {
            "title": "Water per dog per day (optional)",
            "description": "The sources give no amount; ask your vet. Leave empty to list pet water without a quantity.",
            "type": "number",
            "minimum": 0,
            "maximum": 20,
            "x-unit": "L"
          },
          "catWaterLitersPerDay": {
            "title": "Water per cat per day (optional)",
            "type": "number",
            "minimum": 0,
            "maximum": 5,
            "x-unit": "L"
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "maxLength": 8,
            "default": "EUR"
          },
          "budget": {
            "title": "Budget (optional)",
            "type": "number",
            "minimum": 0
          },
          "unitPrices": {
            "title": "Your unit prices (optional)",
            "description": "Costs are only estimated for items you price here.",
            "type": "array",
            "maxItems": 7,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "item": {
                  "title": "Item",
                  "type": "string",
                  "enum": [
                    "water-liter",
                    "food-1000kcal",
                    "flashlight",
                    "battery-set",
                    "radio",
                    "first-aid-kit",
                    "sleeping-bag-blanket"
                  ]
                },
                "price": {
                  "title": "Price per unit",
                  "type": "number",
                  "minimum": 0
                }
              },
              "required": [
                "item",
                "price"
              ]
            }
          }
        },
        "required": [
          "adults"
        ]
      },
      "DisasterPrepBuilderResult": {
        "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": [
              "guideline",
              "days",
              "people",
              "waterLiters",
              "waterLitersPerPersonPerDay",
              "waterLitersHotWeather",
              "petWaterLiters",
              "foodKcal",
              "quantities",
              "checklist",
              "hazardAdditions",
              "cost"
            ],
            "properties": {
              "guideline": {
                "type": "string",
                "enum": [
                  "readygov",
                  "bbk"
                ]
              },
              "days": {
                "type": "integer"
              },
              "people": {
                "type": "integer"
              },
              "waterLitersPerPersonPerDay": {
                "type": "number"
              },
              "waterLiters": {
                "type": "number",
                "description": "people × liters per person per day × days."
              },
              "waterLitersHotWeather": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Double the water figure (Ready.gov: in very hot temperatures water needs can double); only when heat is selected."
              },
              "petWaterLiters": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Only if pet water per day was entered."
              },
              "foodKcal": {
                "type": "number",
                "description": "(adults × kcal/adult + children × kcal/child) × days; infants excluded (formula/baby food listed separately)."
              },
              "quantities": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "item",
                    "quantity",
                    "unit",
                    "basis"
                  ],
                  "properties": {
                    "item": {
                      "type": "string"
                    },
                    "quantity": {
                      "type": "number"
                    },
                    "unit": {
                      "type": "string"
                    },
                    "basis": {
                      "type": "string"
                    }
                  }
                }
              },
              "checklist": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "group",
                    "items",
                    "source"
                  ],
                  "properties": {
                    "group": {
                      "type": "string"
                    },
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "source": {
                      "type": "string"
                    }
                  }
                }
              },
              "hazardAdditions": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "hazard",
                    "items",
                    "source"
                  ],
                  "properties": {
                    "hazard": {
                      "type": "string"
                    },
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "source": {
                      "type": "string"
                    }
                  }
                }
              },
              "cost": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "currency",
                  "lines",
                  "total",
                  "budget",
                  "withinBudget"
                ],
                "properties": {
                  "currency": {
                    "type": "string"
                  },
                  "total": {
                    "type": "number"
                  },
                  "budget": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "withinBudget": {
                    "type": [
                      "boolean",
                      "null"
                    ]
                  },
                  "lines": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "item",
                        "quantity",
                        "unitPrice",
                        "cost"
                      ],
                      "properties": {
                        "item": {
                          "type": "string"
                        },
                        "quantity": {
                          "type": "number"
                        },
                        "unitPrice": {
                          "type": "number"
                        },
                        "cost": {
                          "type": "number"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "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"
              }
            }
          }
        }
      },
      "CompatibilityEngineInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "mode": {
            "title": "What do you want to check?",
            "type": "string",
            "enum": [
              "charging",
              "semver",
              "pc"
            ],
            "default": "charging"
          },
          "chargerW": {
            "title": "Charger maximum output",
            "description": "Charging mode.",
            "type": "number",
            "minimum": 1,
            "maximum": 1000,
            "x-unit": "W"
          },
          "chargerPd": {
            "title": "Charger supports USB Power Delivery (USB PD)",
            "type": "boolean",
            "default": true
          },
          "chargerEpr": {
            "title": "Charger supports PD 3.1 EPR (above 100 W)",
            "type": "boolean",
            "default": false
          },
          "deviceW": {
            "title": "Device maximum charging input",
            "type": "number",
            "minimum": 1,
            "maximum": 1000,
            "x-unit": "W"
          },
          "devicePd": {
            "title": "Device charges via USB PD",
            "type": "boolean",
            "default": true
          },
          "deviceEpr": {
            "title": "Device supports PD 3.1 EPR",
            "type": "boolean",
            "default": false
          },
          "cable": {
            "title": "USB-C cable",
            "type": "string",
            "enum": [
              "usb-c-3a",
              "usb-c-5a",
              "usb-c-epr"
            ],
            "default": "usb-c-3a"
          },
          "range": {
            "title": "Required version range",
            "description": "Semver mode. npm syntax.",
            "type": "string"
          },
          "versions": {
            "title": "Installed / candidate versions (one per line)",
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 50
          },
          "cpuSocket": {
            "title": "CPU socket",
            "description": "PC mode.",
            "type": "string"
          },
          "boardSocket": {
            "title": "Motherboard socket",
            "type": "string"
          },
          "ramType": {
            "title": "RAM type",
            "type": "string",
            "enum": [
              "DDR3",
              "DDR4",
              "DDR5"
            ],
            "default": "DDR5"
          },
          "boardRamType": {
            "title": "Motherboard RAM type",
            "type": "string",
            "enum": [
              "DDR3",
              "DDR4",
              "DDR5"
            ],
            "default": "DDR5"
          },
          "ramModules": {
            "title": "RAM modules",
            "type": "integer",
            "minimum": 1,
            "maximum": 16
          },
          "boardSlots": {
            "title": "Motherboard RAM slots",
            "type": "integer",
            "minimum": 1,
            "maximum": 16
          },
          "cpuW": {
            "title": "CPU power (TDP/PPT)",
            "type": "number",
            "minimum": 0,
            "maximum": 1000,
            "x-unit": "W"
          },
          "gpuW": {
            "title": "Graphics card power",
            "type": "number",
            "minimum": 0,
            "maximum": 2000,
            "x-unit": "W"
          },
          "otherW": {
            "title": "Everything else",
            "type": "number",
            "minimum": 0,
            "maximum": 1000,
            "default": 75,
            "x-unit": "W"
          },
          "psuW": {
            "title": "Power supply rating",
            "type": "number",
            "minimum": 100,
            "maximum": 3000,
            "x-unit": "W"
          },
          "headroomPercent": {
            "title": "Desired PSU headroom",
            "type": "number",
            "minimum": 0,
            "maximum": 100,
            "default": 30,
            "x-unit": "%"
          }
        },
        "required": []
      },
      "CompatibilityEngineResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "mode",
              "compatible",
              "checks"
            ],
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "charging",
                  "semver",
                  "pc"
                ]
              },
              "compatible": {
                "type": "boolean"
              },
              "checks": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "check",
                    "pass",
                    "detail"
                  ],
                  "properties": {
                    "check": {
                      "type": "string"
                    },
                    "pass": {
                      "type": "boolean"
                    },
                    "detail": {
                      "type": "string"
                    },
                    "marginW": {
                      "type": "number"
                    }
                  }
                }
              },
              "charging": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "expectedMaxW",
                  "bottleneck",
                  "usbPd",
                  "epr",
                  "limits"
                ],
                "properties": {
                  "expectedMaxW": {
                    "type": "number"
                  },
                  "bottleneck": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "usbPd": {
                    "type": "boolean"
                  },
                  "epr": {
                    "type": "boolean"
                  },
                  "limits": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "part",
                        "watts"
                      ],
                      "properties": {
                        "part": {
                          "type": "string"
                        },
                        "watts": {
                          "type": "number"
                        }
                      }
                    }
                  }
                }
              },
              "semver": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "range",
                  "results",
                  "highestSatisfying"
                ],
                "properties": {
                  "range": {
                    "type": "string"
                  },
                  "highestSatisfying": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "results": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "version",
                        "satisfies"
                      ],
                      "properties": {
                        "version": {
                          "type": "string"
                        },
                        "satisfies": {
                          "type": "boolean"
                        }
                      }
                    }
                  }
                }
              },
              "pc": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "estimatedLoadW",
                  "recommendedPsuW"
                ],
                "properties": {
                  "estimatedLoadW": {
                    "type": "number"
                  },
                  "recommendedPsuW": {
                    "type": "number"
                  }
                }
              }
            }
          },
          "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"
              }
            }
          }
        }
      },
      "WhatChangedInThisLawInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "oldText": {
            "title": "Old version (text)",
            "type": "string",
            "maxLength": 400000
          },
          "newText": {
            "title": "New version (text)",
            "type": "string",
            "maxLength": 400000
          },
          "oldUrl": {
            "title": "Or: URL of the old version",
            "description": "Official source (e.g. gesetze-im-internet.de, eur-lex.europa.eu, legislation.gov.uk).",
            "type": "string",
            "format": "uri"
          },
          "newUrl": {
            "title": "Or: URL of the new version",
            "type": "string",
            "format": "uri"
          },
          "citation": {
            "title": "Citation / amending act (optional)",
            "type": "string",
            "maxLength": 500
          },
          "effectiveDate": {
            "title": "Effective date of the new version (optional)",
            "type": "string",
            "format": "date"
          }
        },
        "required": []
      },
      "WhatChangedInThisLawResult": {
        "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": [
              "citation",
              "effectiveDate",
              "sectionsBefore",
              "sectionsAfter",
              "counts",
              "changes",
              "sources"
            ],
            "properties": {
              "citation": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "effectiveDate": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "sectionsBefore": {
                "type": "integer"
              },
              "sectionsAfter": {
                "type": "integer"
              },
              "counts": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "added",
                  "removed",
                  "modified",
                  "headingOnly"
                ],
                "properties": {
                  "added": {
                    "type": "integer"
                  },
                  "removed": {
                    "type": "integer"
                  },
                  "modified": {
                    "type": "integer"
                  },
                  "headingOnly": {
                    "type": "integer"
                  }
                }
              },
              "sources": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "side",
                    "label",
                    "fetchedAt"
                  ],
                  "properties": {
                    "side": {
                      "type": "string"
                    },
                    "label": {
                      "type": "string"
                    },
                    "fetchedAt": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                }
              },
              "changes": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "kind",
                    "section",
                    "heading",
                    "before",
                    "after",
                    "wordDiff",
                    "similarity",
                    "numbersChanged",
                    "durationsChanged",
                    "modalChanged"
                  ],
                  "properties": {
                    "kind": {
                      "type": "string",
                      "enum": [
                        "section-added",
                        "section-removed",
                        "section-modified",
                        "heading-changed"
                      ]
                    },
                    "section": {
                      "type": "string"
                    },
                    "heading": {
                      "type": "string"
                    },
                    "before": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "after": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "wordDiff": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "kept [-removed-] {+added+}"
                    },
                    "similarity": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "numbersChanged": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "removed",
                        "added"
                      ],
                      "properties": {
                        "removed": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "added": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "durationsChanged": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "removed",
                        "added"
                      ],
                      "properties": {
                        "removed": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "added": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "modalChanged": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "removed",
                        "added"
                      ],
                      "properties": {
                        "removed": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "added": {
                          "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"
              }
            }
          }
        }
      }
    }
  }
}