{
  "openapi": "3.1.1",
  "info": {
    "title": "Ohmforge Thermal Calculator: Junction, Heatsink & Board Temperature Map API",
    "version": "1.0.0",
    "summary": "Junction temperature from θJC/θCS/θSA, heatsink size, fin estimate and a PCB temperature map.",
    "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://ohmforgethermalcalculator.usefulweb.site"
    }
  ],
  "paths": {
    "/api/v1/calculate": {
      "post": {
        "operationId": "calculate",
        "summary": "Junction temperature from θJC/θCS/θSA, heatsink size, fin estimate and a PCB temperature map.",
        "description": "Four thermal estimates for electronics. Junction: the junction, case and heatsink temperatures from the power and the thermal resistances θJC, θCS and θSA (or θJA), with an optional parallel path through the board, the margin to Tj,max and the heatsink θSA you need. Heatsink: θSA of a plate-fin heatsink in still air from its dimensions, with fin efficiency and the optimum fin gap. Plate and board: a 2-D steady temperature map of a plate or of an Ohmforge board model whose parts have a power, from in-plane conduction (FR-4 and copper layers) and convection on both faces, with the temperature under every part. Same engine as the Thermal tab of Ohmforge’s Circuit calculators; estimates, not certified engineering.\n\nMethodology:\n- Junction: series resistances add (θJC + θCS + θSA); a second path through the board (θJB + θBA) acts in parallel, 1/θ = 1/θ₁ + 1/θ₂, and the heat splits in inverse proportion. Tj = Ta + P·θ. The required θSA solves the same chain for Tj = Tj,max.\n- Heatsink: vertical plate fins in still air. The channel heat transfer coefficient comes from the Bar-Cohen–Rohsenow composite correlation Nu = (576/El² + 2.873/√El)^−½ with the Elenbaas number El = Ra·s/L, air properties at the film temperature (Sutherland laws), fin efficiency tanh(mLc)/(mLc) with Lc = H + t/2, radiation from the outer envelope. The sink temperature is found by bisection, because h grows with the temperature difference.\n- Plate and board: cell-centred finite volumes of k·t·∇²T − h·(T − Ta) + q = 0 on a regular grid inside the outline, insulated edges unless clamped (half-cell conductance to the clamp). Board stacks use k·t = k_FR4·t_FR4 + Σ k_Cu·t_Cu·coverage. The symmetric system is solved with Proofline’s sparse Cholesky (reverse Cuthill–McKee ordering); the heat balance (convection + clamp = sources) is reported.\n- Verified against the analytic fin with insulated tip θ(x)/θ₀ = cosh(m(L − x))/cosh(mL) (error falls 4× per grid halving), the uniform-source limit T = Ta + P/(hA), linear 1-D conduction between two clamps, the exact fin efficiency formula and the laminar and fully developed limits of the channel correlation.\n\nEstimates, not certified engineering. Datasheet θJA values hold for the JEDEC test board only; natural convection coefficients depend on orientation, enclosure and neighbours; the board map assumes a uniform temperature through the thickness and constant h. Measure critical parts.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "ohmforge_thermal_calculator",
        "x-owner-app": "ohmforge",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OhmforgeThermalCalculatorInput"
              },
              "examples": {
                "example1": {
                  "summary": "TO-220 regulator, 10 W, on a 4 K/W heatsink with a board path",
                  "value": {
                    "mode": "junction",
                    "powerW": 10,
                    "ambientC": 40,
                    "tjMaxC": 125,
                    "thetaJC": 1.5,
                    "thetaCS": 0.5,
                    "thetaSA": 4,
                    "thetaJB": 10,
                    "thetaBA": 20
                  }
                },
                "example2": {
                  "summary": "SOT-23 part without a heatsink (θJA only)",
                  "value": {
                    "mode": "junction",
                    "powerW": 0.35,
                    "ambientC": 50,
                    "tjMaxC": 150,
                    "thetaJA": 250
                  }
                },
                "example3": {
                  "summary": "100 × 100 mm heatsink with 12 fins, 10 W",
                  "value": {
                    "mode": "heatsink",
                    "powerW": 10,
                    "ambientC": 25,
                    "baseWidthMm": 100,
                    "baseLengthMm": 100,
                    "finHeightMm": 30,
                    "finThicknessMm": 1.5,
                    "finCount": 12,
                    "conductivity": 200,
                    "emissivity": 0.8,
                    "thetaJC": 1,
                    "thetaCS": 0.3
                  }
                },
                "example4": {
                  "summary": "Aluminium plate 100 × 80 mm with two heat sources",
                  "value": {
                    "mode": "plate",
                    "widthMm": 100,
                    "heightMm": 80,
                    "thicknessMm": 1.6,
                    "conductivity": 200,
                    "sources": "U1 50 40 10 10 2\nQ1 20 20 5 5 1",
                    "hTop": 10,
                    "hBottom": 10
                  }
                },
                "example5": {
                  "summary": "Sensor-node PCB: radio 0.5 W and MCU 0.3 W",
                  "value": {
                    "mode": "board",
                    "board": "{\"format\":\"ohmforge-board\",\"version\":1,\"name\":\"Sensor node 70 × 50 mm\",\"thickness\":1.6,\"outline\":{\"shape\":\"rect\",\"width\":70,\"height\":50},\"holes\":[{\"id\":\"H1\",\"x\":3.5,\"y\":3.5,\"diameter\":3.2},{\"id\":\"H2\",\"x\":66.5,\"y\":3.5,\"diameter\":3.2},{\"id\":\"H3\",\"x\":66.5,\"y\":46.5,\"diameter\":3.2},{\"id\":\"H4\",\"x\":3.5,\"y\":46.5,\"diameter\":3.2}],\"parts\":[{\"id\":\"U1\",\"kind\":\"radio-module\",\"x\":50,\"y\":34,\"width\":18,\"depth\":25.5,\"height\":3.2,\"side\":\"top\",\"powerW\":0.5},{\"id\":\"U2\",\"kind\":\"smd-ic\",\"x\":30,\"y\":20,\"width\":7,\"depth\":7,\"height\":1.8,\"side\":\"top\",\"powerW\":0.3},{\"id\":\"C1\",\"kind\":\"electrolytic\",\"x\":18,\"y\":36,\"width\":8,\"depth\":8,\"height\":12,\"side\":\"top\"},{\"id\":\"SW1\",\"kind\":\"tactile-button\",\"x\":58,\"y\":10,\"width\":6,\"depth\":6,\"height\":5,\"side\":\"top\"},{\"id\":\"D1\",\"kind\":\"led-5mm\",\"x\":44,\"y\":10,\"width\":5.8,\"depth\":5.8,\"height\":8.7,\"side\":\"top\"}],\"connectors\":[{\"id\":\"J1\",\"kind\":\"usb-c\",\"edge\":\"left\",\"position\":25,\"width\":8.94,\"height\":3.26,\"depth\":7.35,\"overhang\":0.6,\"offsetZ\":0,\"side\":\"top\"},{\"id\":\"J2\",\"kind\":\"barrel-jack\",\"edge\":\"top\",\"position\":25,\"width\":9,\"height\":11,\"depth\":14,\"overhang\":0,\"offsetZ\":0,\"side\":\"top\"},{\"id\":\"J3\",\"kind\":\"header-right-angle\",\"edge\":\"right\",\"position\":20,\"width\":15.24,\"height\":2.54,\"depth\":8.5,\"overhang\":3,\"offsetZ\":0,\"side\":\"top\"}],\"keepouts\":[{\"id\":\"K1\",\"label\":\"Button access\",\"x\":58,\"y\":10,\"width\":8,\"depth\":8,\"heightAbove\":30,\"lidOpening\":true}]}",
                    "copperLayers": 2,
                    "copperUm": 35,
                    "copperCoverage": 50,
                    "hTop": 10,
                    "hBottom": 10,
                    "gridCells": 80
                  }
                },
                "example6": {
                  "summary": "Copper strip clamped at one end (fin check)",
                  "value": {
                    "mode": "plate",
                    "widthMm": 100,
                    "heightMm": 10,
                    "thicknessMm": 1,
                    "conductivity": 390,
                    "sources": "R1 95 5 10 10 1",
                    "hTop": 10,
                    "hBottom": 10,
                    "clampEdge": "left",
                    "clampC": 25,
                    "gridCells": 100
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OhmforgeThermalCalculatorResult"
                }
              }
            }
          },
          "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/tool": {
      "get": {
        "operationId": "getToolDefinition",
        "summary": "Inputs, output schema and examples for this tool",
        "responses": {
          "200": {
            "description": "Tool definition.",
            "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"
                }
              }
            }
          }
        }
      },
      "OhmforgeThermalCalculatorInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "mode": {
            "title": "Calculation",
            "type": "string",
            "enum": [
              "junction",
              "heatsink",
              "plate",
              "board"
            ],
            "default": "junction"
          },
          "powerW": {
            "title": "Power",
            "description": "Junction and heatsink: the heat the part dissipates.",
            "type": "number",
            "minimum": 0,
            "maximum": 100000,
            "x-unit": "W"
          },
          "ambientC": {
            "title": "Ambient temperature",
            "description": "Air around the part, heatsink or board (inside the enclosure, not the room).",
            "type": "number",
            "minimum": -100,
            "maximum": 300,
            "default": 25,
            "x-unit": "°C"
          },
          "tjMaxC": {
            "title": "Maximum junction temperature",
            "description": "Junction: from the datasheet (often 125 or 150 °C); gives the margin and the θSA needed.",
            "type": "number",
            "minimum": -50,
            "maximum": 400,
            "x-unit": "°C"
          },
          "thetaJC": {
            "title": "θJC junction to case",
            "description": "Junction: datasheet value. Heatsink: optional, to report the junction temperature too.",
            "type": "number",
            "minimum": 0,
            "maximum": 10000,
            "x-unit": "K/W"
          },
          "thetaCS": {
            "title": "θCS case to heatsink (interface)",
            "description": "Thermal pad, grease or insulating washer: typically 0.1–1 K/W for TO-220.",
            "type": "number",
            "minimum": 0,
            "maximum": 10000,
            "x-unit": "K/W"
          },
          "thetaSA": {
            "title": "θSA heatsink to ambient",
            "description": "Junction: the heatsink datasheet value (or the result of the heatsink mode). Leave empty for a part without a heatsink and enter θJA.",
            "type": "number",
            "minimum": 0,
            "maximum": 10000,
            "x-unit": "K/W"
          },
          "thetaJA": {
            "title": "θJA junction to ambient (no heatsink)",
            "description": "Junction without a heatsink: the datasheet value, measured on a JEDEC test board.",
            "type": "number",
            "minimum": 0,
            "maximum": 10000,
            "x-unit": "K/W"
          },
          "thetaJB": {
            "title": "θJB junction to board (parallel path)",
            "description": "Optional second path through the leads and the board; needs θBA.",
            "type": "number",
            "minimum": 0,
            "maximum": 10000,
            "x-unit": "K/W"
          },
          "thetaBA": {
            "title": "θBA board to ambient",
            "description": "Optional: how well the board area around the part sheds heat (a board temperature map gives an estimate: rise ÷ power).",
            "type": "number",
            "minimum": 0,
            "maximum": 10000,
            "x-unit": "K/W"
          },
          "baseWidthMm": {
            "title": "Heatsink width (across the fins)",
            "type": "number",
            "minimum": 5,
            "maximum": 1000,
            "x-unit": "mm"
          },
          "baseLengthMm": {
            "title": "Fin length (vertical, along the air flow)",
            "type": "number",
            "minimum": 5,
            "maximum": 1000,
            "x-unit": "mm"
          },
          "baseThicknessMm": {
            "title": "Base thickness",
            "type": "number",
            "minimum": 0.5,
            "maximum": 50,
            "default": 5,
            "x-unit": "mm"
          },
          "finHeightMm": {
            "title": "Fin height",
            "type": "number",
            "minimum": 1,
            "maximum": 300,
            "x-unit": "mm"
          },
          "finThicknessMm": {
            "title": "Fin thickness",
            "type": "number",
            "minimum": 0.2,
            "maximum": 20,
            "x-unit": "mm"
          },
          "finCount": {
            "title": "Number of fins",
            "type": "integer",
            "minimum": 2,
            "maximum": 200
          },
          "conductivity": {
            "title": "Material conductivity",
            "description": "Heatsink or plate material: aluminium alloys 150–210, copper 390, steel 50, FR-4 0.3.",
            "type": "number",
            "minimum": 0.01,
            "maximum": 2000,
            "default": 200,
            "x-unit": "W/(m·K)"
          },
          "emissivity": {
            "title": "Surface emissivity",
            "description": "Heatsink radiation: anodised or painted about 0.8, bare aluminium about 0.1; 0 ignores radiation.",
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 0.8
          },
          "widthMm": {
            "title": "Plate width",
            "type": "number",
            "minimum": 1,
            "maximum": 2000,
            "x-unit": "mm"
          },
          "heightMm": {
            "title": "Plate height",
            "type": "number",
            "minimum": 1,
            "maximum": 2000,
            "x-unit": "mm"
          },
          "thicknessMm": {
            "title": "Plate thickness",
            "type": "number",
            "minimum": 0.01,
            "maximum": 100,
            "default": 1.6,
            "x-unit": "mm"
          },
          "sources": {
            "title": "Heat sources on the plate",
            "description": "Plate mode: one source per line — name x y width depth power (centre and size in mm from the lower-left corner, power in W).",
            "type": "string",
            "maxLength": 8000
          },
          "board": {
            "title": "Board model (JSON)",
            "description": "Board mode: the board of Ohmforge’s Board & enclosure dialog (format ohmforge-board) with powerW (W) on the parts that get warm. The outline, thickness and part footprints come from it.",
            "type": "string",
            "maxLength": 200000
          },
          "copperLayers": {
            "title": "Copper layers",
            "description": "Board mode: number of copper layers (planes spread heat best).",
            "type": "integer",
            "minimum": 0,
            "maximum": 32,
            "default": 2
          },
          "copperUm": {
            "title": "Copper thickness per layer",
            "description": "35 µm = 1 oz/ft², 70 µm = 2 oz.",
            "type": "number",
            "minimum": 1,
            "maximum": 400,
            "default": 35,
            "x-unit": "µm"
          },
          "copperCoverage": {
            "title": "Copper coverage",
            "description": "Board mode: average share of each layer covered by copper (pours and planes high, signal layers low).",
            "type": "number",
            "minimum": 0,
            "maximum": 100,
            "default": 50,
            "x-unit": "%"
          },
          "hTop": {
            "title": "Convection coefficient, top face",
            "description": "Still air with radiation about 5–15, a fan 20–100.",
            "type": "number",
            "minimum": 0,
            "maximum": 100000,
            "default": 10,
            "x-unit": "W/(m²·K)"
          },
          "hBottom": {
            "title": "Convection coefficient, bottom face",
            "type": "number",
            "minimum": 0,
            "maximum": 100000,
            "default": 10,
            "x-unit": "W/(m²·K)"
          },
          "clampEdge": {
            "title": "Clamped edge",
            "description": "An edge held at a fixed temperature, e.g. clamped to a chassis or cold plate.",
            "type": "string",
            "enum": [
              "none",
              "left",
              "right",
              "bottom",
              "top",
              "left-right"
            ],
            "default": "none"
          },
          "clampC": {
            "title": "Clamp temperature",
            "description": "Default: the ambient temperature.",
            "type": "number",
            "minimum": -100,
            "maximum": 300,
            "x-unit": "°C"
          },
          "gridCells": {
            "title": "Grid cells along the longer side",
            "description": "Finer grids resolve hot spots better; 60 is a good default.",
            "type": "integer",
            "minimum": 4,
            "maximum": 160,
            "default": 60
          }
        },
        "required": []
      },
      "OhmforgeThermalCalculatorResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "mode",
              "junction",
              "heatsink",
              "map"
            ],
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "junction",
                  "heatsink",
                  "plate",
                  "board"
                ]
              },
              "junction": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "powerW",
                  "ambientC",
                  "tjMaxC",
                  "mainPath",
                  "mainTheta",
                  "boardTheta",
                  "totalTheta",
                  "junctionC",
                  "caseC",
                  "sinkC",
                  "boardC",
                  "mainPowerW",
                  "boardPowerW",
                  "marginC",
                  "maxPowerW",
                  "requiredThetaSA"
                ],
                "properties": {
                  "powerW": {
                    "type": "number"
                  },
                  "ambientC": {
                    "type": "number"
                  },
                  "tjMaxC": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "mainPath": {
                    "type": "string",
                    "enum": [
                      "heatsink",
                      "theta-ja"
                    ]
                  },
                  "mainTheta": {
                    "type": "number"
                  },
                  "boardTheta": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "totalTheta": {
                    "type": "number"
                  },
                  "junctionC": {
                    "type": "number"
                  },
                  "caseC": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "sinkC": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "boardC": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "mainPowerW": {
                    "type": "number"
                  },
                  "boardPowerW": {
                    "type": "number"
                  },
                  "marginC": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "maxPowerW": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "requiredThetaSA": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "θSA (K/W) that keeps the junction at the limit; ≤ 0 = impossible even with an ideal heatsink; null without a limit or when the board path alone suffices."
                  }
                }
              },
              "heatsink": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "powerW",
                  "ambientC",
                  "sinkC",
                  "junctionC",
                  "thetaSA",
                  "spacingMm",
                  "optimumSpacingMm",
                  "h",
                  "hRadiation",
                  "finEfficiency",
                  "elenbaas",
                  "nusselt",
                  "finAreaM2",
                  "baseAreaM2",
                  "convectionW",
                  "radiationW",
                  "iterations"
                ],
                "properties": {
                  "powerW": {
                    "type": "number"
                  },
                  "ambientC": {
                    "type": "number"
                  },
                  "sinkC": {
                    "type": "number"
                  },
                  "junctionC": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "thetaSA": {
                    "type": "number"
                  },
                  "spacingMm": {
                    "type": "number"
                  },
                  "optimumSpacingMm": {
                    "type": "number"
                  },
                  "h": {
                    "type": "number"
                  },
                  "hRadiation": {
                    "type": "number"
                  },
                  "finEfficiency": {
                    "type": "number"
                  },
                  "elenbaas": {
                    "type": "number"
                  },
                  "nusselt": {
                    "type": "number"
                  },
                  "finAreaM2": {
                    "type": "number"
                  },
                  "baseAreaM2": {
                    "type": "number"
                  },
                  "convectionW": {
                    "type": "number"
                  },
                  "radiationW": {
                    "type": "number"
                  },
                  "iterations": {
                    "type": "integer"
                  }
                }
              },
              "map": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "nx",
                  "ny",
                  "cellMm",
                  "maxC",
                  "maxAtMm",
                  "minC",
                  "meanC",
                  "powerW",
                  "convectionW",
                  "clampW",
                  "balanceError",
                  "sheetConductance",
                  "hTotal",
                  "sources",
                  "solver"
                ],
                "properties": {
                  "nx": {
                    "type": "integer"
                  },
                  "ny": {
                    "type": "integer"
                  },
                  "cellMm": {
                    "type": "array",
                    "items": {
                      "type": "number"
                    }
                  },
                  "maxC": {
                    "type": "number"
                  },
                  "maxAtMm": {
                    "type": "array",
                    "items": {
                      "type": "number"
                    }
                  },
                  "minC": {
                    "type": "number"
                  },
                  "meanC": {
                    "type": "number"
                  },
                  "powerW": {
                    "type": "number"
                  },
                  "convectionW": {
                    "type": "number"
                  },
                  "clampW": {
                    "type": "number",
                    "description": "Heat into the clamped edge (W); negative when the clamp heats the plate."
                  },
                  "balanceError": {
                    "type": "number"
                  },
                  "sheetConductance": {
                    "type": "number",
                    "description": "In-plane k·t of the plate or board stack, W/K."
                  },
                  "hTotal": {
                    "type": "number"
                  },
                  "sources": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "name",
                        "powerW",
                        "meanC",
                        "maxC"
                      ],
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "powerW": {
                          "type": "number"
                        },
                        "meanC": {
                          "type": "number"
                        },
                        "maxC": {
                          "type": "number"
                        }
                      }
                    }
                  },
                  "solver": {
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "unknowns",
                      "nonZeros",
                      "bandwidthBefore",
                      "bandwidthAfter",
                      "relativeResidual"
                    ],
                    "properties": {
                      "unknowns": {
                        "type": "integer"
                      },
                      "nonZeros": {
                        "type": "integer"
                      },
                      "bandwidthBefore": {
                        "type": "integer"
                      },
                      "bandwidthAfter": {
                        "type": "integer"
                      },
                      "relativeResidual": {
                        "type": "number"
                      }
                    }
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      }
    }
  }
}