{
  "openapi": "3.1.1",
  "info": {
    "title": "Public technical data explorers 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://publicdata.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": [
                "energy-grid-explorer",
                "internet-archive-change-explorer",
                "public-spending-explorer",
                "satellite-change-explorer",
                "software-adoption-explorer"
              ]
            }
          }
        ],
        "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/energy-grid-explorer/calculate": {
      "post": {
        "operationId": "calculateEnergyGridExplorer",
        "summary": "Generation mix, load, renewable share, cross-border flows and power prices for European grids.",
        "description": "Pulls public net electricity generation per source, load, cross-border physical flows and day-ahead prices from the Energy-Charts API by Fraunhofer ISE for a country and date range, then computes energy per source, renewable share, peak and minimum load, net imports per neighbour and price statistics. Paste saved Energy-Charts JSON to analyse offline.\n\nMethodology:\n- Live data: GET https://api.energy-charts.info/public_power?country=…&start=…&end=… (net public generation per source in MW, usually 15-minute steps), /cbpf (cross-border physical flows in GW, positive = import) and /price?bzn=… (day-ahead price, EUR/MWh). Dates are local (Central European) calendar days, end inclusive.\n- Energy per source = Σ(MW × step) using the median sampling step; load, residual load, share series, scheduled trading and pumped-storage charging are excluded from generation.\n- Renewable share = renewable energy ÷ total generation, counting hydro run-of-river, reservoir, biomass, geothermal, wind and solar fully and waste at 50 % (biogenic share). This reproduces Energy-Charts' own \"Renewable share of generation\" series, whose plain mean is shown for comparison.\n- Peak / minimum load are the highest and lowest samples of the \"Load\" series with their UTC timestamps; prices report mean, extremes and the number of negative-price intervals.\n- Prices are only requested for bidding zones Energy-Charts publishes under CC BY 4.0 (SMARD.de data: DE-LU, AT, BE, CH, CZ, DK1, FR, HU, IT-North, NL, NO2, PL, SE4, SI); other zones are marked private/internal use by the API terms.\n- Outages: no keyless public outage API was verified (ENTSO-E Transparency requires a registered security token), so outage data is not provided.",
        "tags": [
          "public-data"
        ],
        "x-mcp-tool": "energy_grid_explorer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnergyGridExplorerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Germany, 1 Oct 2026 midday (pasted Energy-Charts JSON)",
                  "value": {
                    "source": "pasted",
                    "country": "de",
                    "pastedPower": "{\"unix_seconds\":[1790848800,1790849700,1790850600,1790851500,1790852400,1790853300,1790854200,1790855100,1790856000,1790856900,1790857800,1790858700,1790859600],\"production_types\":[{\"name\":\"Hydro pumped storage consumption\",\"data\":[-1589.9,-2220.2,-2488.5,-3176.3,-3006.0,-2738.7,-3014.6,-2900.1,-2477.4,-1063.5,-530.4,-436.8,-732.1]},{\"name\":\"Cross border electricity trading\",\"data\":[2048.2,1843.7,2148.2,2703.1,3983.9,4178.4,4904.4,5045.5,5272.9,5347.4,5075.1,5226.4,7183.6]},{\"name\":\"Hydro Run-of-River\",\"data\":[1122.5,1111.9,1109.8,1113.8,1111.1,1118.2,1104.1,1101.1,1102.8,1097.9,1078.9,1060.1,1056.6]},{\"name\":\"Biomass\",\"data\":[3721.5,3715.5,3698.3,3688.7,3663.6,3667.1,3659.5,3660.0,3653.3,3659.2,3658.9,3668.0,3667.5]},{\"name\":\"Fossil brown coal / lignite\",\"data\":[8913.6,8918.4,8918.4,8930.0,8926.5,8968.8,9014.4,9023.2,9052.5,9012.6,9053.1,9093.8,9086.2]},{\"name\":\"Fossil hard coal\",\"data\":[3481.9,3383.1,3203.2,2974.7,2894.4,2888.0,2931.5,2946.8,3034.8,3173.1,3322.9,3343.2,3170.0]},{\"name\":\"Fossil oil\",\"data\":[230.7,230.8,230.9,230.3,230.2,230.0,230.1,230.7,232.0,231.7,231.2,222.9,119.1]},{\"name\":\"Fossil coal-derived gas\",\"data\":[347.7,347.4,338.8,342.7,340.4,333.4,332.6,388.4,423.9,426.2,430.7,435.8,440.1]},{\"name\":\"Fossil gas\",\"data\":[5622.5,5602.2,5592.2,5562.9,5511.9,5499.8,5456.2,5462.9,5560.2,5708.7,5675.1,5708.7,5645.4]},{\"name\":\"Geothermal\",\"data\":[13.2,13.2,13.2,13.2,13.2,13.2,13.2,13.2,13.2,13.2,13.2,13.2,13.2]},{\"name\":\"Hydro water reservoir\",\"data\":[4.7,3.5,3.8,4.8,4.7,5.1,5.3,7.4,6.9,6.7,4.4,5.0,4.7]},{\"name\":\"Hydro pumped storage\",\"data\":[11.8,9.5,9.5,9.5,9.6,9.9,14.7,58.9,130.9,34.6,153.7,94.6,38.2]},{\"name\":\"Others\",\"data\":[132.7,132.4,132.4,132.4,132.4,132.4,132.4,132.4,132.4,132.4,132.7,132.4,132.4]},{\"name\":\"Waste\",\"data\":[1267.3,1269.8,1271.7,1275.2,1275.0,1270.6,1270.0,1267.8,1268.1,1263.0,1261.6,1264.2,1261.1]},{\"name\":\"Wind offshore\",\"data\":[2587.1,2725.8,2791.7,2695.3,2342.7,2244.7,2341.6,2251.5,2478.8,2584.7,2668.5,2657.9,3229.2]},{\"name\":\"Wind onshore\",\"data\":[5458.9,5368.5,5325.4,5267.3,5132.2,4930.4,4911.5,4796.6,4735.9,4691.6,4583.5,4598.6,4485.3]},{\"name\":\"Solar\",\"data\":[26884.6,27149.8,27194.6,26952.3,26494.0,25820.4,24943.3,24151.8,23060.4,22124.0,20922.8,19650.5,18329.3]},{\"name\":\"Load\",\"data\":[64505.5,64119.0,63860.0,63954.7,64183.1,63568.0,63056.5,63155.2,62686.6,63541.9,62723.3,61936.9,62818.8]},{\"name\":\"Residual load\",\"data\":[29574.8,28874.8,28548.3,29039.8,30214.1,30572.6,30860.1,31955.3,32411.5,34141.7,34548.5,35030.0,36775.0]},{\"name\":\"Renewable share of load\",\"data\":[62.6,63.5,63.8,63.1,61.3,60.4,59.6,57.9,56.9,54.7,53.5,52.1,50.0]},{\"name\":\"Renewable share of generation\",\"data\":[67.6,67.8,68.1,68.2,67.8,67.2,66.7,66.0,65.1,64.2,63.2,62.2,62.0]}],\"deprecated\":false}",
                    "pastedPrice": "{\"license_info\":\"CC BY 4.0 (creativecommons.org/licenses/by/4.0) from Bundesnetzagentur | SMARD.de\",\"unix_seconds\":[1790848800,1790849700,1790850600,1790851500,1790852400,1790853300,1790854200,1790855100,1790856000,1790856900,1790857800,1790858700,1790859600],\"price\":[160.89,164.01,160.45,163.41,153.31,152.45,151.37,150.96,152.14,147.09,150.64,151.47,150.03],\"unit\":\"EUR / MWh\",\"deprecated\":false}",
                    "pastedFlows": "{\"unix_seconds\":[1790848800,1790849700,1790850600,1790851500,1790852400,1790853300,1790854200,1790855100,1790856000,1790856900,1790857800,1790858700,1790859600],\"countries\":[{\"name\":\"Austria\",\"data\":[-0.936,-1.08,-1.037,-0.885,-0.44,-0.402,-0.366,-0.332,-0.105,-0.031,-0.002,-0.044,0.012]},{\"name\":\"Belgium\",\"data\":[0.548,0.428,0.228,0.312,-0.094,-0.348,-0.106,-0.366,-0.552,-0.46,-0.654,-0.426,-0.313]},{\"name\":\"Czech Republic\",\"data\":[0.97,0.904,0.968,1.078,1.617,1.753,1.781,1.874,2.088,2.146,2.145,2.353,2.605]},{\"name\":\"Denmark\",\"data\":[2.692,2.751,2.584,2.48,2.429,2.377,2.279,2.298,1.73,1.533,1.123,1.115,2.533]},{\"name\":\"France\",\"data\":[-0.914,-0.901,-0.93,-0.553,-0.579,-0.582,-0.378,-0.292,-0.484,-0.554,-0.529,-0.393,-0.464]},{\"name\":\"Luxembourg\",\"data\":[-0.53,-0.546,-0.512,-0.487,-0.481,-0.461,-0.459,-0.428,-0.412,-0.421,-0.382,-0.386,-0.416]},{\"name\":\"Netherlands\",\"data\":[0.522,0.881,1.218,1.201,1.407,1.709,1.63,1.625,1.951,1.885,2.026,1.96,1.958]},{\"name\":\"Norway\",\"data\":[0.925,0.965,1.006,1.002,0.953,0.874,0.826,0.852,0.819,0.872,1.063,1.191,1.195]},{\"name\":\"Poland\",\"data\":[0.581,0.549,0.648,0.697,1.152,1.286,1.34,1.442,1.599,1.516,1.408,1.644,1.828]},{\"name\":\"Sweden\",\"data\":[0.413,0.414,0.413,0.414,0.421,0.421,0.421,0.422,0.431,0.431,0.431,0.432,0.432]},{\"name\":\"Switzerland\",\"data\":[-1.446,-1.607,-1.417,-1.096,-0.88,-0.981,-0.782,-0.665,-0.975,-0.938,-0.955,-0.933,-0.98]},{\"name\":\"sum\",\"data\":[2.825,2.757,3.17,4.162,5.505,5.646,6.187,6.43,6.089,5.98,5.674,6.512,8.388]}],\"deprecated\":false}",
                    "includePrices": true,
                    "includeFlows": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EnergyGridExplorerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/internet-archive-change-explorer/calculate": {
      "post": {
        "operationId": "calculateInternetArchiveChangeExplorer",
        "summary": "See how a web page changed in the Wayback Machine: capture timeline plus the changes that matter.",
        "description": "Lists the distinct Wayback Machine captures of a URL, picks the captures closest to two dates (or exact timestamps), fetches both raw archived versions and diffs them, ranking meaningful changes — prices, headings, legal/policy terms, dates, contacts, links — above noise. Paste CDX rows and two HTML versions to analyse offline.\n\nMethodology:\n- Capture list: Wayback CDX API GET https://web.archive.org/cdx/search/cdx?url=…&output=json&fl=timestamp,original,statuscode,digest,length,mimetype&filter=statuscode:200&filter=mimetype:text/html, one capture per day (collapse=timestamp:8) — or per month for spans over 900 days. A new \"version\" starts whenever the content digest (SHA-1) changes.\n- Capture selection: exact 14-digit timestamps if given, otherwise the successful HTML capture closest to each date, taken from the timeline query (from = before − 30 days, to = after + 30 days); only if that is empty does the tool fall back to CDX closest=…&sort=closest&limit=1.\n- Archived pages are fetched raw (without the Wayback toolbar or URL rewriting) from https://web.archive.org/web/<timestamp>id_/<original URL>. Identical digests skip the fetch.\n- The two versions are compared with the Website Change Explainer engine: block-level LCS diff, word diffs, and rule-based categories (price, legal/policy terms, contact, link target, title, date, heading, number) ranked above trivial noise (whitespace, timestamps, copyright years, tracking parameters).\n- Similarity is the Dice coefficient over the words of the extracted page text (htmlToText).\n- Caveats: digests also change for http/https/www variants, embedded tokens or ads; the archive may miss periods; content loaded by JavaScript after page load is usually not in the raw HTML.",
        "tags": [
          "public-data"
        ],
        "x-mcp-tool": "internet_archive_change_explorer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InternetArchiveChangeExplorerInput"
              },
              "examples": {
                "example1": {
                  "summary": "example.com: Aug 2025 vs Sep 2026 (pasted CDX rows + archived HTML)",
                  "value": {
                    "url": "https://example.com/",
                    "beforeTimestamp": "20250801002042",
                    "afterTimestamp": "20260901000146",
                    "maxCaptures": 40,
                    "maxChanges": 25,
                    "pastedCdx": "[[\"timestamp\",\"original\",\"statuscode\",\"digest\",\"length\",\"mimetype\"],[\"20240701002435\",\"http://www.example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"699\",\"text/html\"],[\"20240801010121\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"751\",\"text/html\"],[\"20240901000219\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"1074\",\"text/html\"],[\"20241001000436\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"713\",\"text/html\"],[\"20241101002130\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"711\",\"text/html\"],[\"20241201001928\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"1263\",\"text/html\"],[\"20250101004557\",\"https://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"1232\",\"text/html\"],[\"20250201012603\",\"http://user:pass@example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"1202\",\"text/html\"],[\"20250301003025\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"1211\",\"text/html\"],[\"20250401000301\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"745\",\"text/html\"],[\"20250501001414\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"740\",\"text/html\"],[\"20250601000522\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"743\",\"text/html\"],[\"20250701005008\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"746\",\"text/html\"],[\"20250801002042\",\"http://example.com/\",\"200\",\"JI6OR3QR4CI526JD6TMMNZNV4QPMPQCH\",\"737\",\"text/html\"],[\"20250901000034\",\"https://example.com/\",\"200\",\"YXWQ7LLPPIZ7CVO6DVQ4U3Y2IO5M42AG\",\"1345\",\"text/html\"],[\"20251001001217\",\"https://example.com/\",\"200\",\"YXWQ7LLPPIZ7CVO6DVQ4U3Y2IO5M42AG\",\"1375\",\"text/html\"],[\"20251101000454\",\"https://www.example.com/\",\"200\",\"JUWMXAQNHPTRTHYQWT3EJILYCL7YC3PQ\",\"961\",\"text/html\"],[\"20251201000848\",\"http://www.example.com/\",\"200\",\"JUWMXAQNHPTRTHYQWT3EJILYCL7YC3PQ\",\"937\",\"text/html\"],[\"20260101000936\",\"http://www.example.com/\",\"200\",\"JUWMXAQNHPTRTHYQWT3EJILYCL7YC3PQ\",\"1009\",\"text/html\"],[\"20260201000022\",\"https://example.com/\",\"200\",\"4N5T7URO6PDNDBFG3V3AAQ45MXR3EXWK\",\"1040\",\"text/html\"],[\"20260301000114\",\"https://example.com/\",\"200\",\"UB6ILJGAIGCZBRVPWK2UVEWKHOYWSIYT\",\"1054\",\"text/html\"],[\"20260401000016\",\"https://example.com/\",\"200\",\"M7CPWPJVRUMERYFUWXWAHQRA4HOEEEXZ\",\"1042\",\"text/html\"],[\"20260501000121\",\"https://example.com/\",\"200\",\"M7CPWPJVRUMERYFUWXWAHQRA4HOEEEXZ\",\"1041\",\"text/html\"],[\"20260601000130\",\"https://example.com/\",\"200\",\"M7CPWPJVRUMERYFUWXWAHQRA4HOEEEXZ\",\"1041\",\"text/html\"],[\"20260701000143\",\"https://example.com/\",\"200\",\"PKUMGV5XIIUJG5CKD4HZMCRWKUMVP5S6\",\"1050\",\"text/html\"],[\"20260801000202\",\"https://example.com/\",\"200\",\"PKUMGV5XIIUJG5CKD4HZMCRWKUMVP5S6\",\"1049\",\"text/html\"],[\"20260901000146\",\"https://example.com/\",\"200\",\"PKUMGV5XIIUJG5CKD4HZMCRWKUMVP5S6\",\"1050\",\"text/html\"]]",
                    "pastedBefore": "<!doctype html>\n<html>\n<head>\n    <title>Example Domain</title>\n\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <style type=\"text/css\">\n    body {\n        background-color: #f0f0f2;\n        margin: 0;\n        padding: 0;\n        font-family: -apple-system, system-ui, BlinkMacSystemFont, \"Segoe UI\", \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n        \n    }\n    div {\n        width: 600px;\n        margin: 5em auto;\n        padding: 2em;\n        background-color: #fdfdff;\n        border-radius: 0.5em;\n        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);\n    }\n    a:link, a:visited {\n        color: #38488f;\n        text-decoration: none;\n    }\n    @media (max-width: 700px) {\n        div {\n            margin: 0 auto;\n            width: auto;\n        }\n    }\n    </style>    \n</head>\n\n<body>\n<div>\n    <h1>Example Domain</h1>\n    <p>This domain is for use in illustrative examples in documents. You may use this\n    domain in literature without prior coordination or asking for permission.</p>\n    <p><a href=\"https://www.iana.org/domains/example\">More information...</a></p>\n</div>\n</body>\n</html>\n",
                    "pastedAfter": "<!doctype html><html lang=\"en\"><head><title>Example Domain</title><link rel=\"icon\" href=\"data:,\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><style>body{background:#eee;width:60vw;margin:15vh auto;font-family:system-ui,sans-serif}h1{font-size:1.5em}div{opacity:0.8}a:link,a:visited{color:#348}</style></head><body><div><h1>Example Domain</h1><p>This domain is for use in documentation examples without needing permission. Avoid use in operations.</p><p><a href=\"https://iana.org/domains/example\">Learn more</a></p></div></body></html>\n"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InternetArchiveChangeExplorerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/public-spending-explorer/calculate": {
      "post": {
        "operationId": "calculatePublicSpendingExplorer",
        "summary": "Search government contracts and grants: who pays whom, totals per agency and vendor.",
        "description": "Searches US federal awards on USAspending.gov (contracts, IDVs, grants, other assistance) or EU contract award notices on TED, then totals the results per agency/buyer and per recipient and draws the agency → recipient relationship graph. Paste a saved API response to analyse it offline.\n\nMethodology:\n- USAspending: POST https://api.usaspending.gov/api/v2/search/spending_by_award/ with filters {keywords, recipient_search_text, award_type_codes (one group), time_period}, sorted by \"Award Amount\" descending. \"Award Amount\" is the award's total obligated value, not only the money obligated inside the period.\n- For live USAspending searches the tool also calls spending_by_category/awarding_agency and /recipient (obligations of all matching transactions inside the period) and spending_by_award_count (counts per award group), so the totals are not limited to the listed page.\n- TED: POST https://api.ted.europa.eu/v3/notices/search (anonymous, no key) with an expert query restricted to contract award notices (can-standard, can-social, can-desg, can-tran) and the publication-date range. Multilingual names prefer English. Notice values are not split between several winners and are summed per currency — currencies are never converted.\n- Per-buyer and per-recipient totals sum only the awards listed (top N by amount for USAspending, newest N for TED). The graph links each buyer/agency to its recipients (edge = summed listed value), keeping the largest relationships up to 60 nodes.\n\nAward data is reported by agencies and may be revised; amounts are nominal and unconverted.",
        "tags": [
          "public-data"
        ],
        "x-mcp-tool": "public_spending_explorer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicSpendingExplorerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Pasted USAspending response: largest \"wildfire\" grants FY2026",
                  "value": {
                    "source": "pasted",
                    "pastedJson": "{\"limit\":8,\"results\":[{\"Award ID\":\"06D01725\",\"Recipient Name\":\"FLORIDA DEPARTMENT OF ENVIRONMENTAL PROTECTION\",\"Award Amount\":844671000.0,\"Awarding Agency\":\"Environmental Protection Agency\",\"Awarding Sub Agency\":\"Environmental Protection Agency\",\"Start Date\":\"2025-07-01\",\"End Date\":\"2032-06-30\",\"Description\":\"DESCRIPTION:THIS ACTION PROVIDES FUNDING IN THE AMOUNT OF $844,671,000 TO FLORIDA DEPARTME\",\"generated_internal_id\":\"ASST_NON_06D01725_068\"},{\"Award ID\":\"06D01826\",\"Recipient Name\":\"FLORIDA DEPARTMENT OF ENVIRONMENTAL PROTECTION\",\"Award Amount\":806392000.0,\"Awarding Agency\":\"Environmental Protection Agency\",\"Awarding Sub Agency\":\"Environmental Protection Agency\",\"Start Date\":\"2025-07-01\",\"End Date\":\"2032-06-30\",\"Description\":\"DESCRIPTION:THIS ACTION PROVIDES FUNDING IN THE AMOUNT OF $806,392,000 TO THE FLORIDA DEPA\",\"generated_internal_id\":\"ASST_NON_06D01826_068\"},{\"Award ID\":\"06D08726\",\"Recipient Name\":\"GEORGIA ENVIRONMENTAL FINANCE AUTHORITY\",\"Award Amount\":359487000.0,\"Awarding Agency\":\"Environmental Protection Agency\",\"Awarding Sub Agency\":\"Environmental Protection Agency\",\"Start Date\":\"2026-07-01\",\"End Date\":\"2033-06-30\",\"Description\":\"DESCRIPTION:THIS ACTION PROVIDES FUNDING IN THE AMOUNT OF $359,487,000 TO THE GEORGIA ENVI\",\"generated_internal_id\":\"ASST_NON_06D08726_068\"},{\"Award ID\":\"05D51125\",\"Recipient Name\":\"NORTH CAROLINA DEPARTMENT OF ENVIRONMENTAL QUALITY\",\"Award Amount\":253681000.0,\"Awarding Agency\":\"Environmental Protection Agency\",\"Awarding Sub Agency\":\"Environmental Protection Agency\",\"Start Date\":\"2025-07-01\",\"End Date\":\"2032-06-30\",\"Description\":\"DESCRIPTION:THIS ACTION APPROVES AN AWARD IN THE AMOUNT OF $253,681,000 TO PROVIDE FUNDING\",\"generated_internal_id\":\"ASST_NON_05D51125_068\"},{\"Award ID\":\"06D08526\",\"Recipient Name\":\"GEORGIA ENVIRONMENTAL FINANCE AUTHORITY\",\"Award Amount\":124892000.0,\"Awarding Agency\":\"Environmental Protection Agency\",\"Awarding Sub Agency\":\"Environmental Protection Agency\",\"Start Date\":\"2026-07-01\",\"End Date\":\"2033-06-30\",\"Description\":\"DESCRIPTION:THIS ACTION APPROVES FUNDING IN THE AMOUNT OF $124,892,000 TO THE GEORGIA ENVI\",\"generated_internal_id\":\"ASST_NON_06D08526_068\"},{\"Award ID\":\"DEGD0000892\",\"Recipient Name\":\"MIDWEST ENERGY, INC\",\"Award Amount\":96922280.0,\"Awarding Agency\":\"Department of Energy\",\"Awarding Sub Agency\":\"Department of Energy\",\"Start Date\":\"2024-10-01\",\"End Date\":\"2029-09-30\",\"Description\":\"BIPARTISAN INFRASTRUCTURE LAW (BIL) - TRANSMISSION LINE REBUILD/REPLACEMENT FOR WILDFIRE M\",\"generated_internal_id\":\"ASST_NON_DEGD0000892_089\"},{\"Award ID\":\"DEGD0000885\",\"Recipient Name\":\"HOLY CROSS ELECTRIC ASSOCIATION, INC\",\"Award Amount\":96746446.0,\"Awarding Agency\":\"Department of Energy\",\"Awarding Sub Agency\":\"Department of Energy\",\"Start Date\":\"2024-08-21\",\"End Date\":\"2029-08-20\",\"Description\":\"BIPARTISAN INFRASTRUCTURE LAW (BIL) - WILDFIRE ASSESSMENT AND RESILIENCE FOR NETWORKS (WAR\",\"generated_internal_id\":\"ASST_NON_DEGD0000885_089\"},{\"Award ID\":\"DEGD0000884\",\"Recipient Name\":\"XCEL ENERGY SERVICES INC.\",\"Award Amount\":95876582.0,\"Awarding Agency\":\"Department of Energy\",\"Awarding Sub Agency\":\"Department of Energy\",\"Start Date\":\"2024-10-01\",\"End Date\":\"2029-09-30\",\"Description\":\"BIPARTISAN INFRASTRUCTURE LAW (BIL) - WILDFIRE MITIGATION AND EXTREME WEATHER RESILIENCE F\",\"generated_internal_id\":\"ASST_NON_DEGD0000884_089\"}],\"page_metadata\":{\"page\":1,\"hasNext\":true}}",
                    "limit": 50
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicSpendingExplorerResult"
                }
              }
            }
          },
          "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/satellite-change-explorer/calculate": {
      "post": {
        "operationId": "calculateSatelliteChangeExplorer",
        "summary": "Compare NASA satellite images of any place on two dates: true colour, NDVI, night lights.",
        "description": "Pick a place (latitude/longitude + radius, or a bounding box) and two dates. The tool builds side-by-side NASA GIBS images for each chosen layer — MODIS/VIIRS true colour, 7-2-1 false colour, 30 m Harmonized Landsat Sentinel-2, NDVI composites and VIIRS night lights — with the resolution, revisit and cloud caveats you need to read them correctly.\n\nMethodology:\n- The area is a lat/lon box: from a centre, half-width r km gives ±r/111.32° latitude and ±r/(111.32·cos φ)° longitude. Image height follows the box aspect in degrees (plate carrée, EPSG:4326).\n- Images come from NASA GIBS via the Worldview Snapshot API (https://wvs.earthdata.nasa.gov/api/v1/snapshot, REQUEST=GetSnapshot, CRS=EPSG:4326, BBOX=south,west,north,east, TIME=YYYY-MM-DD); an equivalent GIBS WMS 1.3.0 GetMap URL is returned too.\n- Layer identifiers, maximum resolutions (tile-matrix sets), formats and first available dates were taken from the GIBS EPSG:4326 \"best\" WMTS capabilities. Composite layers are requested at the start of their period (16-day periods begin on day-of-year 1, 17, 33, …; monthly on day 1).\n- If one image pixel is smaller than half the layer resolution the result flags \"upsampled\": detail finer than the native resolution is interpolation, not information.\n- No automated change detection: the tool cannot download image pixels, so it does not compute change statistics. Compare visually and mind clouds, season, sun angle and sensor differences.\n\nImagery courtesy of NASA EOSDIS GIBS. Visual comparison only; not suitable for legal or insurance evidence without the source data.",
        "tags": [
          "public-data"
        ],
        "x-mcp-tool": "satellite_change_explorer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SatelliteChangeExplorerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Nile Delta, summer 2025 vs summer 2026: true colour + NDVI",
                  "value": {
                    "lat": 30.6,
                    "lon": 31.2,
                    "radiusKm": 80,
                    "dateBefore": "2025-07-20",
                    "dateAfter": "2026-07-20",
                    "layers": [
                      "modis-terra-truecolor",
                      "ndvi-16day"
                    ],
                    "width": 512
                  }
                },
                "example2": {
                  "summary": "Berlin at 30 m (HLS Sentinel-2), August 2025 vs August 2026",
                  "value": {
                    "bbox": "13.2,52.4,13.6,52.6",
                    "dateBefore": "2025-08-13",
                    "dateAfter": "2026-08-05",
                    "layers": [
                      "hls-sentinel2"
                    ],
                    "width": 640
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SatelliteChangeExplorerResult"
                }
              }
            }
          },
          "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/software-adoption-explorer/calculate": {
      "post": {
        "operationId": "calculateSoftwareAdoptionExplorer",
        "summary": "Open-source usage signals: weekly downloads, growth and version adoption for npm, PyPI, crates.",
        "description": "Fetches public download statistics for an npm, PyPI or crates.io package, aggregates them into weekly totals with 4-week growth and long-run change, shows which versions are actually downloaded (npm last week, crates.io last 90 days) and adds dependent counts from deps.dev. Paste saved API JSON to analyse offline.\n\nMethodology:\n- npm: GET https://api.npmjs.org/downloads/range/last-year/<pkg> (daily downloads) and /versions/<pkg>/last-week (downloads per version over the last 7 days).\n- PyPI: GET https://pypistats.org/api/packages/<pkg>/overall?mirrors=false (daily downloads without mirrors, ~180 days) and /recent. pypistats has no per-version endpoint, so version adoption is not available for PyPI.\n- crates.io: GET https://crates.io/api/v1/crates/<name> (metadata, version ids, all-time downloads) and /crates/<name>/downloads (last 90 days per version plus \"extra\" downloads of older versions); the platform fetcher sends an identifying User-Agent, which crates.io requires.\n- Daily values are summed into Monday-start weeks; weeks with fewer than 7 days of data are marked partial and excluded from growth. Growth = last 4 complete weeks vs the 4 before; long-run change = last 4 vs first 4 complete weeks.\n- Version shares = downloads of a version ÷ all version downloads in the same window; majors group 1.x, 2.x … (0.y releases are grouped per minor). \"Highest stable\" is the largest non-prerelease semver.\n- Dependents: deps.dev v3 package lookup → default version → v3alpha …:dependents, i.e. packages in the same ecosystem whose resolved dependency graph contains exactly that version (direct + indirect). Older versions' dependents are not included.\n- Downloads include CI systems, mirrors and bots; they are a usage signal, not a user count.",
        "tags": [
          "public-data"
        ],
        "x-mcp-tool": "software_adoption_explorer",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SoftwareAdoptionExplorerInput"
              },
              "examples": {
                "example1": {
                  "summary": "left-pad on npm, 1 June – 27 September 2026 (pasted API JSON)",
                  "value": {
                    "ecosystem": "npm",
                    "package": "left-pad",
                    "includeDependents": false,
                    "pastedDownloads": "{\"start\":\"2026-06-01\",\"end\":\"2026-09-27\",\"package\":\"left-pad\",\"downloads\":[{\"downloads\":175000,\"day\":\"2026-06-01\"},{\"downloads\":232816,\"day\":\"2026-06-02\"},{\"downloads\":0,\"day\":\"2026-06-03\"},{\"downloads\":194864,\"day\":\"2026-06-04\"},{\"downloads\":216877,\"day\":\"2026-06-05\"},{\"downloads\":143672,\"day\":\"2026-06-06\"},{\"downloads\":185145,\"day\":\"2026-06-07\"},{\"downloads\":239294,\"day\":\"2026-06-08\"},{\"downloads\":230969,\"day\":\"2026-06-09\"},{\"downloads\":234152,\"day\":\"2026-06-10\"},{\"downloads\":221639,\"day\":\"2026-06-11\"},{\"downloads\":211916,\"day\":\"2026-06-12\"},{\"downloads\":119920,\"day\":\"2026-06-13\"},{\"downloads\":85689,\"day\":\"2026-06-14\"},{\"downloads\":203347,\"day\":\"2026-06-15\"},{\"downloads\":216032,\"day\":\"2026-06-16\"},{\"downloads\":238580,\"day\":\"2026-06-17\"},{\"downloads\":227656,\"day\":\"2026-06-18\"},{\"downloads\":199703,\"day\":\"2026-06-19\"},{\"downloads\":158151,\"day\":\"2026-06-20\"},{\"downloads\":145207,\"day\":\"2026-06-21\"},{\"downloads\":213758,\"day\":\"2026-06-22\"},{\"downloads\":217567,\"day\":\"2026-06-23\"},{\"downloads\":207146,\"day\":\"2026-06-24\"},{\"downloads\":198848,\"day\":\"2026-06-25\"},{\"downloads\":198730,\"day\":\"2026-06-26\"},{\"downloads\":122444,\"day\":\"2026-06-27\"},{\"downloads\":129394,\"day\":\"2026-06-28\"},{\"downloads\":208940,\"day\":\"2026-06-29\"},{\"downloads\":227003,\"day\":\"2026-06-30\"},{\"downloads\":199514,\"day\":\"2026-07-01\"},{\"downloads\":201960,\"day\":\"2026-07-02\"},{\"downloads\":158513,\"day\":\"2026-07-03\"},{\"downloads\":95683,\"day\":\"2026-07-04\"},{\"downloads\":91011,\"day\":\"2026-07-05\"},{\"downloads\":213751,\"day\":\"2026-07-06\"},{\"downloads\":223647,\"day\":\"2026-07-07\"},{\"downloads\":218838,\"day\":\"2026-07-08\"},{\"downloads\":206701,\"day\":\"2026-07-09\"},{\"downloads\":188725,\"day\":\"2026-07-10\"},{\"downloads\":112585,\"day\":\"2026-07-11\"},{\"downloads\":0,\"day\":\"2026-07-12\"},{\"downloads\":197758,\"day\":\"2026-07-13\"},{\"downloads\":219483,\"day\":\"2026-07-14\"},{\"downloads\":204443,\"day\":\"2026-07-15\"},{\"downloads\":220701,\"day\":\"2026-07-16\"},{\"downloads\":203782,\"day\":\"2026-07-17\"},{\"downloads\":135474,\"day\":\"2026-07-18\"},{\"downloads\":133764,\"day\":\"2026-07-19\"},{\"downloads\":209041,\"day\":\"2026-07-20\"},{\"downloads\":222618,\"day\":\"2026-07-21\"},{\"downloads\":232408,\"day\":\"2026-07-22\"},{\"downloads\":246014,\"day\":\"2026-07-23\"},{\"downloads\":232139,\"day\":\"2026-07-24\"},{\"downloads\":133414,\"day\":\"2026-07-25\"},{\"downloads\":140608,\"day\":\"2026-07-26\"},{\"downloads\":222134,\"day\":\"2026-07-27\"},{\"downloads\":337501,\"day\":\"2026-07-28\"},{\"downloads\":244182,\"day\":\"2026-07-29\"},{\"downloads\":212975,\"day\":\"2026-07-30\"},{\"downloads\":196545,\"day\":\"2026-07-31\"},{\"downloads\":138423,\"day\":\"2026-08-01\"},{\"downloads\":128097,\"day\":\"2026-08-02\"},{\"downloads\":230019,\"day\":\"2026-08-03\"},{\"downloads\":241200,\"day\":\"2026-08-04\"},{\"downloads\":237078,\"day\":\"2026-08-05\"},{\"downloads\":225288,\"day\":\"2026-08-06\"},{\"downloads\":217107,\"day\":\"2026-08-07\"},{\"downloads\":138038,\"day\":\"2026-08-08\"},{\"downloads\":128615,\"day\":\"2026-08-09\"},{\"downloads\":232606,\"day\":\"2026-08-10\"},{\"downloads\":240670,\"day\":\"2026-08-11\"},{\"downloads\":257056,\"day\":\"2026-08-12\"},{\"downloads\":263563,\"day\":\"2026-08-13\"},{\"downloads\":0,\"day\":\"2026-08-14\"},{\"downloads\":218302,\"day\":\"2026-08-15\"},{\"downloads\":145375,\"day\":\"2026-08-16\"},{\"downloads\":219779,\"day\":\"2026-08-17\"},{\"downloads\":234519,\"day\":\"2026-08-18\"},{\"downloads\":241463,\"day\":\"2026-08-19\"},{\"downloads\":237126,\"day\":\"2026-08-20\"},{\"downloads\":262372,\"day\":\"2026-08-21\"},{\"downloads\":182718,\"day\":\"2026-08-22\"},{\"downloads\":183373,\"day\":\"2026-08-23\"},{\"downloads\":302721,\"day\":\"2026-08-24\"},{\"downloads\":299137,\"day\":\"2026-08-25\"},{\"downloads\":294024,\"day\":\"2026-08-26\"},{\"downloads\":299028,\"day\":\"2026-08-27\"},{\"downloads\":301719,\"day\":\"2026-08-28\"},{\"downloads\":175288,\"day\":\"2026-08-29\"},{\"downloads\":159943,\"day\":\"2026-08-30\"},{\"downloads\":265975,\"day\":\"2026-08-31\"},{\"downloads\":271782,\"day\":\"2026-09-01\"},{\"downloads\":287623,\"day\":\"2026-09-02\"},{\"downloads\":0,\"day\":\"2026-09-03\"},{\"downloads\":236542,\"day\":\"2026-09-04\"},{\"downloads\":163525,\"day\":\"2026-09-05\"},{\"downloads\":211090,\"day\":\"2026-09-06\"},{\"downloads\":0,\"day\":\"2026-09-07\"},{\"downloads\":0,\"day\":\"2026-09-08\"},{\"downloads\":261183,\"day\":\"2026-09-09\"},{\"downloads\":268443,\"day\":\"2026-09-10\"},{\"downloads\":250050,\"day\":\"2026-09-11\"},{\"downloads\":164059,\"day\":\"2026-09-12\"},{\"downloads\":188684,\"day\":\"2026-09-13\"},{\"downloads\":339737,\"day\":\"2026-09-14\"},{\"downloads\":0,\"day\":\"2026-09-15\"},{\"downloads\":278779,\"day\":\"2026-09-16\"},{\"downloads\":280612,\"day\":\"2026-09-17\"},{\"downloads\":306045,\"day\":\"2026-09-18\"},{\"downloads\":387373,\"day\":\"2026-09-19\"},{\"downloads\":499412,\"day\":\"2026-09-20\"},{\"downloads\":395535,\"day\":\"2026-09-21\"},{\"downloads\":314788,\"day\":\"2026-09-22\"},{\"downloads\":316863,\"day\":\"2026-09-23\"},{\"downloads\":327024,\"day\":\"2026-09-24\"},{\"downloads\":334942,\"day\":\"2026-09-25\"},{\"downloads\":251678,\"day\":\"2026-09-26\"},{\"downloads\":298333,\"day\":\"2026-09-27\"}]}",
                    "pastedVersions": "{\"package\":\"left-pad\",\"downloads\":{\"0.0.2\":63,\"1.1.3\":5454,\"1.1.0\":4578,\"0.0.0\":322,\"0.0.4\":115,\"1.3.0\":4110106,\"0.0.9\":965,\"1.1.1\":266,\"0.0.3\":17604,\"1.0.2\":172,\"1.1.2\":395,\"1.0.0\":520,\"1.0.1\":138,\"1.2.0\":101325,\"0.0.1\":70}}"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SoftwareAdoptionExplorerResult"
                }
              }
            }
          },
          "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"
                }
              }
            }
          }
        }
      },
      "EnergyGridExplorerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "source": {
            "title": "Data source",
            "type": "string",
            "enum": [
              "live",
              "pasted"
            ],
            "default": "live"
          },
          "country": {
            "title": "Country",
            "type": "string",
            "enum": [
              "de",
              "at",
              "be",
              "bg",
              "ch",
              "cy",
              "cz",
              "dk",
              "ee",
              "es",
              "fi",
              "fr",
              "gr",
              "hr",
              "hu",
              "ie",
              "it",
              "lt",
              "lu",
              "lv",
              "nl",
              "no",
              "pl",
              "pt",
              "ro",
              "se",
              "si",
              "sk",
              "uk",
              "ba",
              "ge",
              "md",
              "me",
              "mk",
              "rs",
              "ua",
              "xk",
              "eu"
            ],
            "default": "de"
          },
          "startDate": {
            "title": "From (local date)",
            "description": "Default: yesterday. Energy-Charts interprets dates in Central European time.",
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "title": "To (local date, inclusive)",
            "description": "Max 31 days per request.",
            "type": "string",
            "format": "date"
          },
          "includePrices": {
            "title": "Day-ahead prices",
            "type": "boolean",
            "default": true
          },
          "includeFlows": {
            "title": "Cross-border physical flows",
            "type": "boolean",
            "default": true
          },
          "pastedPower": {
            "title": "Pasted /public_power JSON",
            "type": "string",
            "maxLength": 3000000
          },
          "pastedPrice": {
            "title": "Pasted /price JSON (optional)",
            "type": "string",
            "maxLength": 1000000
          },
          "pastedFlows": {
            "title": "Pasted /cbpf JSON (optional)",
            "type": "string",
            "maxLength": 2000000
          }
        },
        "required": []
      },
      "EnergyGridExplorerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "country",
              "countryName",
              "period",
              "generation",
              "mix",
              "load",
              "prices",
              "flows",
              "outages"
            ],
            "properties": {
              "country": {
                "type": "string"
              },
              "countryName": {
                "type": "string"
              },
              "period": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "requestedStart",
                  "requestedEnd",
                  "firstSample",
                  "lastSample",
                  "samples",
                  "stepMinutes"
                ],
                "properties": {
                  "requestedStart": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "requestedEnd": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "firstSample": {
                    "type": "string"
                  },
                  "lastSample": {
                    "type": "string"
                  },
                  "samples": {
                    "type": "integer"
                  },
                  "stepMinutes": {
                    "type": "number"
                  }
                }
              },
              "generation": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "totalGWh",
                  "renewableGWh",
                  "renewableSharePct",
                  "apiRenewableShareOfGenerationPct",
                  "apiRenewableShareOfLoadPct",
                  "netTradingGWh",
                  "pumpedStorageChargingGWh",
                  "residualLoadPeakMW"
                ],
                "properties": {
                  "totalGWh": {
                    "type": "number"
                  },
                  "renewableGWh": {
                    "type": "number"
                  },
                  "renewableSharePct": {
                    "type": "number"
                  },
                  "apiRenewableShareOfGenerationPct": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Unweighted mean of the Energy-Charts series."
                  },
                  "apiRenewableShareOfLoadPct": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "netTradingGWh": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Scheduled cross-border trading balance (positive = import)."
                  },
                  "pumpedStorageChargingGWh": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "residualLoadPeakMW": {
                    "type": [
                      "number",
                      "null"
                    ]
                  }
                }
              },
              "mix": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "name",
                    "gwh",
                    "sharePct",
                    "peakMW",
                    "renewableWeight"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "gwh": {
                      "type": "number"
                    },
                    "sharePct": {
                      "type": "number"
                    },
                    "peakMW": {
                      "type": "number"
                    },
                    "renewableWeight": {
                      "type": "number"
                    }
                  }
                }
              },
              "load": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "avgMW",
                  "peakMW",
                  "peakAt",
                  "minMW",
                  "minAt",
                  "energyGWh"
                ],
                "properties": {
                  "avgMW": {
                    "type": "number"
                  },
                  "peakMW": {
                    "type": "number"
                  },
                  "peakAt": {
                    "type": "string"
                  },
                  "minMW": {
                    "type": "number"
                  },
                  "minAt": {
                    "type": "string"
                  },
                  "energyGWh": {
                    "type": "number"
                  }
                }
              },
              "prices": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "zone",
                  "unit",
                  "avg",
                  "max",
                  "maxAt",
                  "min",
                  "minAt",
                  "negativeIntervals",
                  "intervals",
                  "license"
                ],
                "properties": {
                  "zone": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "unit": {
                    "type": "string"
                  },
                  "avg": {
                    "type": "number"
                  },
                  "max": {
                    "type": "number"
                  },
                  "maxAt": {
                    "type": "string"
                  },
                  "min": {
                    "type": "number"
                  },
                  "minAt": {
                    "type": "string"
                  },
                  "negativeIntervals": {
                    "type": "integer"
                  },
                  "intervals": {
                    "type": "integer"
                  },
                  "license": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                }
              },
              "flows": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "netImportGWh",
                  "neighbours"
                ],
                "properties": {
                  "netImportGWh": {
                    "type": "number"
                  },
                  "neighbours": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "name",
                        "netImportGWh",
                        "maxImportGW",
                        "maxExportGW"
                      ],
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "netImportGWh": {
                          "type": "number"
                        },
                        "maxImportGW": {
                          "type": "number"
                        },
                        "maxExportGW": {
                          "type": "number"
                        }
                      }
                    }
                  }
                }
              },
              "outages": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "available",
                  "note"
                ],
                "properties": {
                  "available": {
                    "type": "boolean"
                  },
                  "note": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "InternetArchiveChangeExplorerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "url": {
            "title": "Page URL",
            "type": "string",
            "format": "uri"
          },
          "beforeDate": {
            "title": "Before date",
            "description": "The capture closest to this date is used. Default: one year ago.",
            "type": "string",
            "format": "date"
          },
          "afterDate": {
            "title": "After date",
            "description": "Default: today (latest capture).",
            "type": "string",
            "format": "date"
          },
          "beforeTimestamp": {
            "title": "Exact \"before\" capture (14-digit timestamp)",
            "type": "string",
            "maxLength": 14
          },
          "afterTimestamp": {
            "title": "Exact \"after\" capture (14-digit timestamp)",
            "type": "string",
            "maxLength": 14
          },
          "maxCaptures": {
            "title": "Captures shown in the timeline",
            "type": "integer",
            "minimum": 5,
            "maximum": 200,
            "default": 40
          },
          "maxChanges": {
            "title": "Max changes listed",
            "type": "integer",
            "minimum": 5,
            "maximum": 200,
            "default": 25
          },
          "pastedCdx": {
            "title": "Pasted CDX output (offline)",
            "description": "output=json rows or default text lines.",
            "type": "string",
            "maxLength": 2000000
          },
          "pastedBefore": {
            "title": "Pasted \"before\" HTML (offline)",
            "type": "string",
            "maxLength": 400000
          },
          "pastedAfter": {
            "title": "Pasted \"after\" HTML (offline)",
            "type": "string",
            "maxLength": 400000
          }
        },
        "required": []
      },
      "InternetArchiveChangeExplorerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "url",
              "before",
              "after",
              "captures",
              "identical",
              "comparison",
              "highlights",
              "unifiedDiff"
            ],
            "properties": {
              "url": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "before": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "timestamp",
                  "time",
                  "original",
                  "digest",
                  "archiveUrl",
                  "rawUrl",
                  "selectedBy"
                ],
                "properties": {
                  "timestamp": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "time": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "original": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "digest": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "archiveUrl": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "rawUrl": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "selectedBy": {
                    "type": "string",
                    "enum": [
                      "nearest-capture",
                      "explicit-timestamp",
                      "pasted"
                    ]
                  }
                }
              },
              "after": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "timestamp",
                  "time",
                  "original",
                  "digest",
                  "archiveUrl",
                  "rawUrl",
                  "selectedBy"
                ],
                "properties": {
                  "timestamp": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "time": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "original": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "digest": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "archiveUrl": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "rawUrl": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "selectedBy": {
                    "type": "string",
                    "enum": [
                      "nearest-capture",
                      "explicit-timestamp",
                      "pasted"
                    ]
                  }
                }
              },
              "captures": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "total",
                  "distinctVersions",
                  "granularity",
                  "items"
                ],
                "properties": {
                  "total": {
                    "type": "integer"
                  },
                  "distinctVersions": {
                    "type": "integer"
                  },
                  "granularity": {
                    "type": "string"
                  },
                  "items": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "timestamp",
                        "time",
                        "original",
                        "statuscode",
                        "digest",
                        "length",
                        "newVersion"
                      ],
                      "properties": {
                        "timestamp": {
                          "type": "string"
                        },
                        "time": {
                          "type": "string"
                        },
                        "original": {
                          "type": "string"
                        },
                        "statuscode": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "digest": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "length": {
                          "type": [
                            "integer",
                            "null"
                          ]
                        },
                        "newVersion": {
                          "type": "boolean"
                        }
                      }
                    }
                  }
                }
              },
              "identical": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "true when both captures have the same content digest (no fetch needed)."
              },
              "comparison": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "similarityPct",
                  "wordsBefore",
                  "wordsAfter",
                  "meaningful",
                  "trivial",
                  "high",
                  "medium",
                  "low"
                ],
                "properties": {
                  "similarityPct": {
                    "type": "number"
                  },
                  "wordsBefore": {
                    "type": "integer"
                  },
                  "wordsAfter": {
                    "type": "integer"
                  },
                  "meaningful": {
                    "type": "integer"
                  },
                  "trivial": {
                    "type": "integer"
                  },
                  "high": {
                    "type": "integer"
                  },
                  "medium": {
                    "type": "integer"
                  },
                  "low": {
                    "type": "integer"
                  }
                }
              },
              "highlights": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "category",
                    "level",
                    "kind",
                    "element",
                    "before",
                    "after",
                    "wordDiff"
                  ],
                  "properties": {
                    "category": {
                      "type": "string"
                    },
                    "level": {
                      "type": "string"
                    },
                    "kind": {
                      "type": "string"
                    },
                    "element": {
                      "type": "string"
                    },
                    "before": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "after": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "wordDiff": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                }
              },
              "unifiedDiff": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "PublicSpendingExplorerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "source": {
            "title": "Data source",
            "type": "string",
            "enum": [
              "usaspending",
              "ted",
              "pasted"
            ],
            "default": "usaspending"
          },
          "keyword": {
            "title": "Keyword",
            "description": "Full-text keyword (award description / notice text).",
            "type": "string",
            "maxLength": 200
          },
          "recipient": {
            "title": "Recipient / vendor name",
            "description": "Optional. USAspending: recipient_search_text; TED: winner-name contains.",
            "type": "string",
            "maxLength": 200
          },
          "awardType": {
            "title": "Award type (USAspending)",
            "type": "string",
            "enum": [
              "contracts",
              "idvs",
              "grants",
              "other_financial_assistance"
            ],
            "default": "contracts"
          },
          "startDate": {
            "title": "From",
            "description": "Default: 365 days before today.",
            "type": "string",
            "format": "date"
          },
          "endDate": {
            "title": "To",
            "description": "Default: today.",
            "type": "string",
            "format": "date"
          },
          "buyerCountry": {
            "title": "Buyer country (TED, ISO 3166 alpha-3)",
            "type": "string",
            "maxLength": 3
          },
          "limit": {
            "title": "Max results",
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 50
          },
          "pastedJson": {
            "title": "Pasted JSON response",
            "description": "Response of USAspending POST /api/v2/search/spending_by_award/ or TED POST /v3/notices/search.",
            "type": "string",
            "maxLength": 2000000
          }
        },
        "required": []
      },
      "PublicSpendingExplorerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "source",
              "query",
              "awards",
              "totals",
              "byBuyer",
              "byRecipient",
              "officialTotals",
              "awardCounts",
              "hasMore"
            ],
            "properties": {
              "source": {
                "type": "string",
                "enum": [
                  "usaspending",
                  "ted",
                  "pasted-usaspending",
                  "pasted-ted"
                ]
              },
              "query": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "Exact request sent to the API (null for pasted data)."
              },
              "awards": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "id",
                    "buyer",
                    "subBuyer",
                    "recipient",
                    "amount",
                    "currency",
                    "startDate",
                    "endDate",
                    "description",
                    "url"
                  ],
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "buyer": {
                      "type": "string"
                    },
                    "subBuyer": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "recipient": {
                      "type": "string"
                    },
                    "amount": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "currency": {
                      "type": "string"
                    },
                    "startDate": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "endDate": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "description": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "url": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                }
              },
              "totals": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "awards",
                  "withAmount",
                  "currency",
                  "amount",
                  "otherCurrencies"
                ],
                "properties": {
                  "awards": {
                    "type": "integer"
                  },
                  "withAmount": {
                    "type": "integer"
                  },
                  "currency": {
                    "type": "string"
                  },
                  "amount": {
                    "type": "number"
                  },
                  "otherCurrencies": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "currency",
                        "amount",
                        "count"
                      ],
                      "properties": {
                        "currency": {
                          "type": "string"
                        },
                        "amount": {
                          "type": "number"
                        },
                        "count": {
                          "type": "integer"
                        }
                      }
                    }
                  }
                }
              },
              "byBuyer": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "name",
                    "amount",
                    "count"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "amount": {
                      "type": "number"
                    },
                    "count": {
                      "type": "integer"
                    }
                  }
                }
              },
              "byRecipient": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "name",
                    "amount",
                    "count"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "amount": {
                      "type": "number"
                    },
                    "count": {
                      "type": "integer"
                    }
                  }
                }
              },
              "officialTotals": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "USAspending spending_by_category totals over ALL matching transactions in the period (not just the listed awards).",
                "additionalProperties": false,
                "required": [
                  "byAgency",
                  "byRecipient"
                ],
                "properties": {
                  "byAgency": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "name",
                        "amount"
                      ],
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "amount": {
                          "type": "number"
                        }
                      }
                    }
                  },
                  "byRecipient": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "name",
                        "amount"
                      ],
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "amount": {
                          "type": "number"
                        }
                      }
                    }
                  }
                }
              },
              "awardCounts": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": {
                  "type": "integer"
                }
              },
              "hasMore": {
                "type": "boolean"
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "SatelliteChangeExplorerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "lat": {
            "title": "Latitude",
            "type": "number",
            "minimum": -85,
            "maximum": 85
          },
          "lon": {
            "title": "Longitude",
            "type": "number",
            "minimum": -180,
            "maximum": 180
          },
          "radiusKm": {
            "title": "Half-width of the area",
            "type": "number",
            "minimum": 1,
            "maximum": 1000,
            "default": 30,
            "x-unit": "km"
          },
          "bbox": {
            "title": "Or bounding box (west,south,east,north)",
            "description": "Overrides latitude/longitude when set.",
            "type": "string",
            "maxLength": 120
          },
          "dateBefore": {
            "title": "Before date",
            "description": "Default: one year before the \"after\" date.",
            "type": "string",
            "format": "date"
          },
          "dateAfter": {
            "title": "After date",
            "description": "Default: yesterday (UTC).",
            "type": "string",
            "format": "date"
          },
          "layers": {
            "title": "Layers",
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "modis-terra-truecolor",
                "modis-aqua-truecolor",
                "viirs-snpp-truecolor",
                "viirs-noaa20-truecolor",
                "modis-terra-721",
                "hls-sentinel2",
                "hls-landsat",
                "ndvi-16day",
                "ndvi-monthly",
                "night-lights"
              ]
            },
            "default": [
              "modis-terra-truecolor"
            ]
          },
          "width": {
            "title": "Image width",
            "type": "integer",
            "minimum": 128,
            "maximum": 1024,
            "default": 512,
            "x-unit": "px"
          }
        },
        "required": []
      },
      "SatelliteChangeExplorerResult": {
        "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": [
              "bbox",
              "center",
              "areaKm",
              "image",
              "dates",
              "layers",
              "changeDetection"
            ],
            "properties": {
              "bbox": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "west",
                  "south",
                  "east",
                  "north"
                ],
                "properties": {
                  "west": {
                    "type": "number"
                  },
                  "south": {
                    "type": "number"
                  },
                  "east": {
                    "type": "number"
                  },
                  "north": {
                    "type": "number"
                  }
                }
              },
              "center": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "lat",
                  "lon"
                ],
                "properties": {
                  "lat": {
                    "type": "number"
                  },
                  "lon": {
                    "type": "number"
                  }
                }
              },
              "areaKm": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "width",
                  "height"
                ],
                "properties": {
                  "width": {
                    "type": "number"
                  },
                  "height": {
                    "type": "number"
                  }
                }
              },
              "image": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "width",
                  "height",
                  "kmPerPixel"
                ],
                "properties": {
                  "width": {
                    "type": "integer"
                  },
                  "height": {
                    "type": "integer"
                  },
                  "kmPerPixel": {
                    "type": "number"
                  }
                }
              },
              "dates": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "before",
                  "after",
                  "daysApart"
                ],
                "properties": {
                  "before": {
                    "type": "string"
                  },
                  "after": {
                    "type": "string"
                  },
                  "daysApart": {
                    "type": "integer"
                  }
                }
              },
              "layers": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "key",
                    "gibsLayer",
                    "title",
                    "instrument",
                    "resolution",
                    "temporal",
                    "availableFrom",
                    "format",
                    "upsampled",
                    "before",
                    "after",
                    "notes"
                  ],
                  "properties": {
                    "key": {
                      "type": "string"
                    },
                    "gibsLayer": {
                      "type": "string"
                    },
                    "title": {
                      "type": "string"
                    },
                    "instrument": {
                      "type": "string"
                    },
                    "resolution": {
                      "type": "string"
                    },
                    "temporal": {
                      "type": "string",
                      "enum": [
                        "daily",
                        "16-day",
                        "monthly"
                      ]
                    },
                    "availableFrom": {
                      "type": "string"
                    },
                    "format": {
                      "type": "string"
                    },
                    "upsampled": {
                      "type": "boolean"
                    },
                    "before": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "requestedDate",
                        "imageDate",
                        "available",
                        "snapshotUrl",
                        "wmsUrl"
                      ],
                      "properties": {
                        "requestedDate": {
                          "type": "string"
                        },
                        "imageDate": {
                          "type": "string"
                        },
                        "available": {
                          "type": "boolean"
                        },
                        "snapshotUrl": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "wmsUrl": {
                          "type": [
                            "string",
                            "null"
                          ]
                        }
                      }
                    },
                    "after": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "requestedDate",
                        "imageDate",
                        "available",
                        "snapshotUrl",
                        "wmsUrl"
                      ],
                      "properties": {
                        "requestedDate": {
                          "type": "string"
                        },
                        "imageDate": {
                          "type": "string"
                        },
                        "available": {
                          "type": "boolean"
                        },
                        "snapshotUrl": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "wmsUrl": {
                          "type": [
                            "string",
                            "null"
                          ]
                        }
                      }
                    },
                    "notes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              },
              "changeDetection": {
                "type": "string",
                "description": "Always \"visual-only\": no pixel comparison is performed."
              }
            }
          },
          "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"
              }
            }
          }
        }
      },
      "SoftwareAdoptionExplorerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "ecosystem": {
            "title": "Registry",
            "type": "string",
            "enum": [
              "npm",
              "pypi",
              "crates"
            ],
            "default": "npm"
          },
          "package": {
            "title": "Package name",
            "type": "string",
            "maxLength": 214
          },
          "includeDependents": {
            "title": "Look up dependents on deps.dev",
            "type": "boolean",
            "default": true
          },
          "pastedDownloads": {
            "title": "Pasted download JSON (offline)",
            "description": "npm /downloads/range/…, pypistats /overall or crates.io /crates/<name>/downloads.",
            "type": "string",
            "maxLength": 3000000
          },
          "pastedVersions": {
            "title": "Pasted version JSON (optional)",
            "description": "npm /versions/<pkg>/last-week, or crates.io /crates/<name> (maps version ids to numbers).",
            "type": "string",
            "maxLength": 3000000
          }
        },
        "required": []
      },
      "SoftwareAdoptionExplorerResult": {
        "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": [
              "ecosystem",
              "package",
              "period",
              "totals",
              "weekly",
              "trend",
              "recent",
              "versions",
              "dependents",
              "registry"
            ],
            "properties": {
              "ecosystem": {
                "type": "string",
                "enum": [
                  "npm",
                  "pypi",
                  "crates"
                ]
              },
              "package": {
                "type": "string"
              },
              "period": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "start",
                  "end",
                  "days"
                ],
                "properties": {
                  "start": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "end": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "days": {
                    "type": "integer"
                  }
                }
              },
              "totals": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "downloads",
                  "avgDaily",
                  "zeroDays"
                ],
                "properties": {
                  "downloads": {
                    "type": "number"
                  },
                  "avgDaily": {
                    "type": "number"
                  },
                  "zeroDays": {
                    "type": "integer"
                  }
                }
              },
              "weekly": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "required": [
                    "weekStart",
                    "downloads",
                    "days",
                    "partial"
                  ],
                  "properties": {
                    "weekStart": {
                      "type": "string"
                    },
                    "downloads": {
                      "type": "number"
                    },
                    "days": {
                      "type": "integer"
                    },
                    "partial": {
                      "type": "boolean"
                    }
                  }
                }
              },
              "trend": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "completeWeeks",
                  "last4Weeks",
                  "previous4Weeks",
                  "growthPct",
                  "first4Weeks",
                  "firstToLastPct",
                  "peakWeek",
                  "peakWeekDownloads"
                ],
                "properties": {
                  "completeWeeks": {
                    "type": "integer"
                  },
                  "last4Weeks": {
                    "type": "number"
                  },
                  "previous4Weeks": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "growthPct": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "first4Weeks": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "firstToLastPct": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "peakWeek": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "peakWeekDownloads": {
                    "type": [
                      "number",
                      "null"
                    ]
                  }
                }
              },
              "recent": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "lastDay",
                  "lastWeek",
                  "lastMonth"
                ],
                "properties": {
                  "lastDay": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "lastWeek": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "lastMonth": {
                    "type": [
                      "number",
                      "null"
                    ]
                  }
                }
              },
              "versions": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "window",
                  "total",
                  "items",
                  "byMajor",
                  "highestStable",
                  "highestStableSharePct"
                ],
                "properties": {
                  "window": {
                    "type": "string"
                  },
                  "total": {
                    "type": "number"
                  },
                  "items": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "version",
                        "downloads",
                        "sharePct"
                      ],
                      "properties": {
                        "version": {
                          "type": "string"
                        },
                        "downloads": {
                          "type": "number"
                        },
                        "sharePct": {
                          "type": "number"
                        }
                      }
                    }
                  },
                  "byMajor": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "major",
                        "downloads",
                        "sharePct"
                      ],
                      "properties": {
                        "major": {
                          "type": "string"
                        },
                        "downloads": {
                          "type": "number"
                        },
                        "sharePct": {
                          "type": "number"
                        }
                      }
                    }
                  },
                  "highestStable": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "highestStableSharePct": {
                    "type": [
                      "number",
                      "null"
                    ]
                  }
                }
              },
              "dependents": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "version",
                  "dependentCount",
                  "directDependentCount",
                  "indirectDependentCount"
                ],
                "properties": {
                  "version": {
                    "type": "string"
                  },
                  "dependentCount": {
                    "type": "integer"
                  },
                  "directDependentCount": {
                    "type": "integer"
                  },
                  "indirectDependentCount": {
                    "type": "integer"
                  }
                }
              },
              "registry": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "latestVersion",
                  "createdAt",
                  "allTimeDownloads"
                ],
                "properties": {
                  "latestVersion": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "createdAt": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "allTimeDownloads": {
                    "type": [
                      "number",
                      "null"
                    ]
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      }
    }
  }
}