{
  "openapi": "3.1.0",
  "info": {
    "title": "MakerPortal compute API",
    "version": "1.0.0",
    "summary": "Deterministic engineering solvers — the same functions that render the published pages.",
    "description": "Three solvers, exposed as GET endpoints. Every one is the *identical function* that renders the corresponding page on makerportal.ai, assigned by reference in a single registry, so an answer here and an answer on the page cannot disagree.\n\nThere is no market-data relay and no model proxy behind any of these — they are own-solver computation only, and no request leaves the function.\n\nEvery response carries `provenance.canonicalUrl`: the published page for exactly these inputs when one exists, and the lane hub when the inputs are off the published grid.\n\nNumbers that are not finite are encoded as the strings \"Infinity\", \"-Infinity\" and \"NaN\". These are real answers, not error states: a notch is −∞ dB at its centre frequency and a low-pass is −∞ dB at Nyquist. JSON has no numeric literal for them and `null` would be a different claim, so a string sentinel is the only encoding that does not lose the answer.",
    "license": {
      "name": "Free with attribution",
      "url": "https://makerportal.ai/terms"
    },
    "contact": {
      "url": "https://makerportal.ai/contact"
    }
  },
  "servers": [
    {
      "url": "https://makerportal.ai"
    }
  ],
  "paths": {
    "/api/v1/biquad-design": {
      "get": {
        "operationId": "biquadDesign",
        "summary": "Design one RBJ-cookbook biquad and report its numerical behaviour.",
        "description": "The identical function that renders /lab/biquad/{type}/{freq}. Returns coefficients at the requested sample rate, coefficients at every other rate whose Nyquist limit clears the corner, pole/zero geometry, the −3 dB points solved by bisection, a Q sweep, a gain sweep where the type uses gain, and the quantised forms. The 240-point response curve is omitted unless include=curve is passed. Non-finite values (a notch is −∞ at f0; a low-pass is −∞ at Nyquist) are encoded as the strings \"Infinity\", \"-Infinity\" and \"NaN\" — JSON has no other honest option, and null would be a different answer.\n\nNumbers that are not finite are encoded as the strings \"Infinity\", \"-Infinity\" and \"NaN\". These are real answers, not error states: a notch is −∞ dB at its centre frequency and a low-pass is −∞ dB at Nyquist. JSON has no numeric literal for them and `null` would be a different claim, so a string sentinel is the only encoding that does not lose the answer.",
        "parameters": [
          {
            "name": "type",
            "in": "query",
            "required": true,
            "description": "Filter type.",
            "schema": {
              "type": "string",
              "enum": [
                "lowpass",
                "highpass",
                "bandpass",
                "notch",
                "allpass",
                "peaking",
                "lowshelf",
                "highshelf"
              ]
            }
          },
          {
            "name": "freq",
            "in": "query",
            "required": true,
            "description": "Corner (or centre) frequency f0 in Hz. Must be below Nyquist.",
            "schema": {
              "type": "number",
              "minimum": 0.1,
              "maximum": 1000000
            }
          },
          {
            "name": "fs",
            "in": "query",
            "required": false,
            "description": "Sample rate in Hz. Defaults to 48000.",
            "schema": {
              "type": "number",
              "minimum": 1000,
              "maximum": 768000,
              "default": 48000
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Filter Q. Defaults to the type’s own default. Shelves ignore it (S is fixed at 1, matching Web Audio).",
            "schema": {
              "type": "number",
              "minimum": 0.01,
              "maximum": 100
            }
          },
          {
            "name": "gain",
            "in": "query",
            "required": false,
            "description": "Peak/shelf gain in dB. Ignored by types that do not use gain.",
            "schema": {
              "type": "number",
              "minimum": -40,
              "maximum": 40
            }
          },
          {
            "name": "include",
            "in": "query",
            "required": false,
            "description": "Comma-separated heavy blocks to include. `curve`: The 240-point log-spaced magnitude response, and one per sweep row.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A solved answer, with provenance.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SolverEnvelope"
                },
                "example": {
                  "inputs": {
                    "type": "lowpass",
                    "freqHz": 1000,
                    "fs": 48000,
                    "q": 0.7071067811865476,
                    "gainDb": 0
                  },
                  "result": {
                    "groupDelayMs": 0.22572310603430518,
                    "type": {
                      "slug": "lowpass",
                      "label": "Low-pass",
                      "noun": "low-pass filter",
                      "defaultQ": 0.7071067811865476,
                      "defaultGainDb": 0,
                      "usesGain": false,
                      "f0Db": -3.0103,
                      "purpose": "Passes everything below the corner and rolls off above it at 12 dB/octave."
                    },
                    "freqHz": 1000,
                    "fs": 48000,
                    "q": 0.7071067811865476,
                    "gainDb": 0,
                    "coeffs": {
                      "b0": 0.003916126660547383,
                      "b1": 0.007832253321094766,
                      "b2": 0.003916126660547383,
                      "a0": 1,
                      "a1": -1.815341082704568,
                      "a2": 0.8310055893467576
                    },
                    "poles": {
                      "real": false,
                      "radii": [
                        0.9115950797074092,
                        0.9115950797074092
                      ],
                      "maxRadius": 0.9115950797074092,
                      "theta": 0.09282484477211987
                    },
                    "zeros": {
                      "real": true,
                      "radii": [
                        1,
                        1
                      ],
                      "maxRadius": 1,
                      "theta": null
                    },
                    "dcDb": -4.821637332766449e-14,
                    "f0Db": -3.010299956639777,
                    "nyquistDb": -334.7433394195403,
                    "peakDb": -4.318207296603919e-8,
                    "peakAtHz": 10,
                    "minus3LowHz": null,
                    "minus3HighHz": 1000.0000099351195,
                    "rates": [
                      {
                        "fs": 8000,
                        "coeffs": {
                          "b0": 0.09763107293781748,
                          "b1": 0.19526214587563495,
                          "b2": 0.09763107293781748,
                          "a0": 1,
                          "a1": -0.9428090415820635,
                          "a2": 0.3333333333333333
                        },
                        "poles": {
                          "real": false,
                          "radii": [
                            0.5773502691896257,
                            0.5773502691896257
                          ],
                          "maxRadius": 0.5773502691896257,
                          "theta": 0.6154797086703871
                        },
                        "nyquistFraction": 0.25,
                        "f0Db": -3.0102999566398116
                      },
                      {
                        "fs": 16000,
                        "coeffs": {
                          "b0": 0.029954582208092478,
                          "b1": 0.059909164416184955,
                          "b2": 0.029954582208092478,
                          "a0": 1,
                          "a1": -1.4542435862515848,
                          "a2": 0.5740619150839548
                        },
                        "poles": {
                          "real": false,
                          "radii": [
                            0.75766873703747,
                            0.75766873703747
                          ],
                          "maxRadius": 0.75766873703747,
                          "theta": 0.2849241266220628
                        },
                        "nyquistFraction": 0.125,
                        "f0Db": -3.0102999566398116
                      },
                      {
                        "fs": 22050,
                        "coeffs": {
                          "b0": 0.01681915010705712,
                          "b1": 0.03363830021411424,
                          "b2": 0.01681915010705712,
                          "a0": 1,
                          "a1": -1.601092394183619,
                          "a2": 0.6683689946118475
                        },
                        "poles": {
                          "real": false,
                          "radii": [
                            0.8175383750086889,
                            0.8175383750086889
                          ],
                          "maxRadius": 0.8175383750086889,
                          "theta": 0.20423988099258802
                        },
                        "nyquistFraction": 0.09070294784580499,
                        "f0Db": -3.010299956639815
                      },
                      {
                        "fs": 32000,
                        "coeffs": {
                          "b0": 0.008442692929079959,
                          "b1": 0.016885385858159917,
                          "b2": 0.008442692929079959,
                          "a0": 1,
                          "a1": -1.7237761727625094,
                          "a2": 0.7575469444788291
                        },
                        "poles": {
                          "real": false,
                          "radii": [
                            0.8703717277570711,
                            0.8703717277570711
                          ],
                          "maxRadius": 0.8703717277570711,
                          "theta": 0.1397356289388815
                        },
                        "nyquistFraction": 0.0625,
                        "f0Db": -3.010299956639792
                      },
                      {
                        "fs": 44100,
                        "coeffs": {
                          "b0": 0.004603998475022464,
                          "b1": 0.009207996950044928,
                          "b2": 0.004603998475022464,
                          "a0": 1,
                          "a1": -1.799096409484668,
                          "a2": 0.817512403384758
                        },
                        "poles": {
                          "real": false,
                          "radii": [
                            0.9041639250626835,
                            0.9041639250626835
                          ],
                          "maxRadius": 0.9041639250626835,
                          "theta": 0.10108717990213778
                        },
                        "nyquistFraction": 0.045351473922902494,
                        "f0Db": -3.0102999566398116
                      },
                      {
                        "fs": 48000,
                        "coeffs": {
                          "b0": 0.003916126660547383,
                          "b1": 0.007832253321094766,
                          "b2": 0.003916126660547383,
                          "a0": 1,
                          "a1": -1.815341082704568,
                          "a2": 0.8310055893467576
                        },
                        "poles": {
                          "real": false,
                          "radii": [
                            0.9115950797074092,
                            0.9115950797074092
                          ],
                          "maxRadius": 0.9115950797074092,
                          "theta": 0.09282484477211987
                        },
                        "nyquistFraction": 0.041666666666666664,
                        "f0Db": -3.010299956639777
                      },
                      {
                        "fs": 96000,
                        "coeffs": {
                          "b0": 0.0010232176384709138,
                          "b1": 0.0020464352769418276,
                          "b2": 0.0010232176384709138,
                          "a0": 1,
                          "a1": -1.9075016260460762,
                          "a2": 0.91159449659996
                        },
                        "poles": {
                          "real": false,
                          "radii": [
                            0.9547745789451875,
                            0.9547745789451875
                          ],
                          "maxRadius": 0.9547745789451875,
                          "theta": 0.04631308624221879
                        },
                        "nyquistFraction": 0.020833333333333332,
                        "f0Db": -3.010299956639723
                      },
                      {
                        "fs": 192000,
                        "coeffs": {
                          "b0": 0.00026165269506587055,
                          "b1": 0.0005233053901317411,
                          "b2": 0.00026165269506587055,
                          "a0": 1,
                          "a1": -1.9537279491407762,
                          "a2": 0.9547745599210397
                        },
                        "poles": {
                          "real": false,
                          "radii": [
                            0.9771256622978641,
                            0.9771256622978641
                          ],
                          "maxRadius": 0.9771256622978641,
                          "theta": 0.023144145931710335
                        },
                        "nyquistFraction": 0.010416666666666666,
                        "f0Db": -3.0102999566404565
                      }
                    ],
                    "words": [
                      {
                        "key": "float64",
                        "label": "float64",
                        "coeffs": {
                          "b0": 0.003916126660547383,
                          "b1": 0.007832253321094766,
                          "b2": 0.003916126660547383,
                          "a0": 1,
                          "a1": -1.815341082704568,
                          "a2": 0.8310055893467576
                        },
                        "qFormat": null,
                        "poles": {
                          "real": false,
                          "radii": [
                            0.9115950797074092,
                            0.9115950797074092
                          ],
                          "maxRadius": 0.9115950797074092,
                          "theta": 0.09282484477211987
                        },
                        "stable": true,
                        "worstErrorDb": null,
                        "worstErrorAtHz": null
                      },
                      {
                        "key": "float32",
                        "label": "float32",
                        "coeffs": {
                          "b0": 0.003916126675903797,
                          "b1": 0.007832253351807594,
                          "b2": 0.003916126675903797,
                          "a0": 1,
                          "a1": -1.8153411149978638,
                          "a2": 0.8310055732727051
                        },
                        "qFormat": null,
                        "poles": {
                          "real": false,
                          "radii": [
                            0.9115950708909658,
                            0.9115950708909658
                          ],
                          "maxRadius": 0.9115950708909658,
                          "theta": 0.09282454978987786
                        },
                        "stable": true,
                        "worstErrorDb": 0.000026850716045393597,
                        "worstErrorAtHz": 10
                      },
                      {
                        "key": "fixed32",
                        "label": "32-bit fixed",
                        "coeffs": {
                          "b0": 0.003916126675903797,
                          "b1": 0.007832253351807594,
                          "b2": 0.003916126675903797,
                          "a0": 1,
                          "a1": -1.8153410824015737,
                          "a2": 0.8310055891051888
                        },
                        "qFormat": {
                          "intBits": 1,
                          "fracBits": 30
                        },
                        "poles": {
                          "real": false,
                          "radii": [
                            0.9115950795749113,
                            0.9115950795749113
                          ],
                          "maxRadius": 0.9115950795749113,
                          "theta": 0.09282484500372117
                        },
                        "stable": true,
                        "worstErrorDb": 3.5796645647678815e-8,
                        "worstErrorAtHz": 2985.72684120468
                      },
                      {
                        "key": "fixed24",
                        "label": "24-bit fixed",
                        "coeffs": {
                          "b0": 0.003916025161743164,
                          "b1": 0.00783228874206543,
                          "b2": 0.003916025161743164,
                          "a0": 1,
                          "a1": -1.8153409957885742,
                          "a2": 0.8310055732727051
                        },
                        "qFormat": {
                          "intBits": 1,
                          "fracBits": 22
                        },
                        "poles": {
                          "real": false,
                          "radii": [
                            0.9115950708909658,
                            0.9115950708909658
                          ],
                          "maxRadius": 0.9115950708909658,
                          "theta": 0.09282525519318896
                        },
                        "stable": true,
                        "worstErrorDb": 0.00013219851855428676,
                        "worstErrorAtHz": 10
                      },
                      {
                        "key": "fixed16",
                        "label": "16-bit fixed",
                        "coeffs": {
                          "b0": 0.00390625,
                          "b1": 0.0078125,
                          "b2": 0.00390625,
                          "a0": 1,
                          "a1": -1.81536865234375,
                          "a2": 0.83099365234375
                        },
                        "qFormat": {
                          "intBits": 1,
                          "fracBits": 14
                        },
                        "poles": {
                          "real": false,
                          "radii": [
                            0.9115885323673999,
                            0.9115885323673999
                          ],
                          "maxRadius": 0.9115885323673999,
                          "theta": 0.09258424046934609
                        },
                        "stable": true,
                        "worstErrorDb": 0.02692806587736385,
                        "worstErrorAtHz": 1506.759934915174
                      }
                    ],
                    "qSweep": [
                      {
                        "value": 0.5,
                        "coeffs": {
                          "b0": 0.0037836976644431432,
                          "b1": 0.0075673953288862865,
                          "b2": 0.0037836976644431432,
                          "a0": 1,
                          "a1": -1.7539529259855138,
                          "a2": 0.7690877166432862
                        },
                        "f0Db": -6.020599913279589,
                        "peakDb": -0.0008660665892234256,
                        "peakAtHz": 10,
                        "minus3Hz": 644.2424436003173,
                        "maxRadius": 0.8769764735294691,
                        "groupDelayMs": 0.15961039245583242
                      },
                      {
                        "value": 0.7071067811865476,
                        "coeffs": {
                          "b0": 0.003916126660547383,
                          "b1": 0.007832253321094766,
                          "b2": 0.003916126660547383,
                          "a0": 1,
                          "a1": -1.815341082704568,
                          "a2": 0.8310055893467576
                        },
                        "f0Db": -3.010299956639777,
                        "peakDb": -4.318207296603919e-8,
                        "peakAtHz": 10,
                        "minus3Hz": 1000.0000099351195,
                        "maxRadius": 0.9115950797074092,
                        "groupDelayMs": 0.22572310603430518
                      },
                      {
                        "value": 1,
                        "coeffs": {
                          "b0": 0.004015505022857752,
                          "b1": 0.008031010045715504,
                          "b2": 0.004015505022857752,
                          "a0": 1,
                          "a1": -1.8614084445321082,
                          "a2": 0.8774704646235392
                        },
                        "f0Db": 2.314385919727886e-14,
                        "peakDb": 1.2491145127745193,
                        "peakAtHz": 712.4456981320011,
                        "minus3Hz": 1168.1843147423306,
                        "maxRadius": 0.9367339348094202,
                        "groupDelayMs": 0.3192204638615984
                      },
                      {
                        "value": 2,
                        "coeffs": {
                          "b0": 0.00414239650255865,
                          "b1": 0.0082847930051173,
                          "b2": 0.00414239650255865,
                          "a0": 1,
                          "a1": -1.920229656436938,
                          "a2": 0.9367992424471726
                        },
                        "f0Db": 6.020599913279687,
                        "peakDb": 6.292958786014533,
                        "peakAtHz": 924.4787110161315,
                        "minus3Hz": 1165.5948454024074,
                        "maxRadius": 0.9678838992602226,
                        "groupDelayMs": 0.6384383593481985
                      },
                      {
                        "value": 4,
                        "coeffs": {
                          "b0": 0.0042088978862774564,
                          "b1": 0.008417795772554913,
                          "b2": 0.0042088978862774564,
                          "a0": 1,
                          "a1": -1.951056722154107,
                          "a2": 0.9678923136992169
                        },
                        "f0Db": 12.041199826559357,
                        "peakDb": 12.108005279832819,
                        "peakAtHz": 986.6956218842213,
                        "minus3Hz": 1102.7816733124848,
                        "maxRadius": 0.983815182693994,
                        "groupDelayMs": 1.2768561724241385
                      },
                      {
                        "value": 10,
                        "coeffs": {
                          "b0": 0.00424983358333473,
                          "b1": 0.00849966716666946,
                          "b2": 0.00424983358333473,
                          "a0": 1,
                          "a1": -1.970032679537168,
                          "a2": 0.9870320138705071
                        },
                        "f0Db": 19.999999999999932,
                        "peakDb": 19.8140428580633,
                        "peakAtHz": 986.6956218842213,
                        "minus3Hz": 1048.3754886986578,
                        "maxRadius": 0.9934948484368236,
                        "groupDelayMs": 3.191780954618915
                      }
                    ],
                    "gainSweep": []
                  },
                  "provenance": {
                    "method": "RBJ Audio EQ Cookbook coefficients solved in float64, with pole and zero radii from the quadratic roots (never from sqrt(|a2|)), the response curve, the real −3 dB crossings, and what 16/24/32-bit word lengths do to stability and in-band error. Pure mathematics — nothing is fetched and nothing is recalled.",
                    "canonicalUrl": "https://makerportal.ai/lab/biquad/lowpass/1000-hz"
                  },
                  "license": "free-with-attribution"
                }
              }
            }
          },
          "400": {
            "description": "A parameter was missing, unparseable or out of range. Never a 500.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Best-effort per-instance rate limit. Not a quota: there is no shared counter, and identical requests are served from the CDN without reaching a function at all.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/room-modes": {
      "get": {
        "operationId": "roomModes",
        "summary": "Solve the eigenmodes of a rectangular room.",
        "description": "The identical function that renders /lab/room-modes/{w}x{l}x{h}. Dimensions are in feet and are converted at 0.3048 m/ft. Returns every mode below maxFreq, the three axial fundamentals, mode pile-ups (three or more modes within 5 Hz, capped at 200 Hz because dense modes above the Schroeder crossover are desirable rather than a defect), the widest axial gap below 200 Hz, and Schroeder frequencies at RT60 = 0.3 s and 0.6 s. The full mode list is omitted unless include=modes is passed; counts are always present.\n\nNumbers that are not finite are encoded as the strings \"Infinity\", \"-Infinity\" and \"NaN\". These are real answers, not error states: a notch is −∞ dB at its centre frequency and a low-pass is −∞ dB at Nyquist. JSON has no numeric literal for them and `null` would be a different claim, so a string sentinel is the only encoding that does not lose the answer.",
        "parameters": [
          {
            "name": "width",
            "in": "query",
            "required": true,
            "description": "Room width in feet.",
            "schema": {
              "type": "number",
              "minimum": 3,
              "maximum": 100
            }
          },
          {
            "name": "length",
            "in": "query",
            "required": true,
            "description": "Room length in feet.",
            "schema": {
              "type": "number",
              "minimum": 3,
              "maximum": 100
            }
          },
          {
            "name": "height",
            "in": "query",
            "required": true,
            "description": "Ceiling height in feet.",
            "schema": {
              "type": "number",
              "minimum": 3,
              "maximum": 40
            }
          },
          {
            "name": "maxFreq",
            "in": "query",
            "required": false,
            "description": "Highest mode frequency to solve for, in Hz. Defaults to 300. Mode count scales with volume × frequency³, so a large room and a high maxFreq together are refused with a 400 once the enumeration would exceed 100,000 modes; the error names the maxFreq that would have worked.",
            "schema": {
              "type": "number",
              "minimum": 20,
              "maximum": 1000,
              "default": 300
            }
          },
          {
            "name": "include",
            "in": "query",
            "required": false,
            "description": "Comma-separated heavy blocks to include. `modes`: Every solved mode and the axial subset, with their (nx, ny, nz) orders.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A solved answer, with provenance.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SolverEnvelope"
                },
                "example": {
                  "inputs": {
                    "widthFt": 12,
                    "lengthFt": 16,
                    "heightFt": 8,
                    "maxFreqHz": 300,
                    "slug": "12x16x8"
                  },
                  "result": {
                    "spec": {
                      "widthFt": 12,
                      "lengthFt": 16,
                      "heightFt": 8
                    },
                    "dims": {
                      "x": 4.8768,
                      "y": 3.6576000000000004,
                      "z": 2.4384
                    },
                    "volumeM3": 43.49467636531201,
                    "surfaceM2": 77.29532928,
                    "fundamentals": [
                      {
                        "axis": "length",
                        "freq": 35.166502624671914
                      },
                      {
                        "axis": "width",
                        "freq": 46.88867016622922
                      },
                      {
                        "axis": "height",
                        "freq": 70.33300524934383
                      }
                    ],
                    "schroederAt": [
                      {
                        "assumedRt60": 0.3,
                        "freq": 166.1011239461159
                      },
                      {
                        "assumedRt60": 0.6,
                        "freq": 234.90246221001155
                      }
                    ],
                    "ratio": {
                      "length": 2,
                      "width": 1.5
                    },
                    "worstAxialGapHz": 35.16650262467192,
                    "modeCounts": {
                      "axial": 18,
                      "tangential": 76,
                      "oblique": 81,
                      "total": 175
                    },
                    "pileups": [
                      {
                        "centerHz": 142.1903383710567,
                        "count": 6
                      },
                      {
                        "centerHz": 157.98938642047898,
                        "count": 6
                      },
                      {
                        "centerHz": 198.40746431702686,
                        "count": 6
                      },
                      {
                        "centerHz": 174.49116499575453,
                        "count": 5
                      },
                      {
                        "centerHz": 166.58492505223015,
                        "count": 4
                      },
                      {
                        "centerHz": 182.54154360935368,
                        "count": 4
                      }
                    ]
                  },
                  "provenance": {
                    "method": "Rectangular-room eigenmode solution f = (c/2)·sqrt((nx/Lx)² + (ny/Ly)² + (nz/Lz)²) at c = 343 m/s, with axial/tangential/oblique classification, pile-up clustering below 200 Hz, the Bolt-area proportion test (Bolt, 1946, JASA), and Schroeder crossovers at two ASSUMED RT60 values. Pure geometry — no material data is involved, which is why RT60 is bracketed rather than stated.",
                    "canonicalUrl": "https://makerportal.ai/lab/room-modes/12x16x8"
                  },
                  "license": "free-with-attribution"
                }
              }
            }
          },
          "400": {
            "description": "A parameter was missing, unparseable or out of range. Never a 500.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Best-effort per-instance rate limit. Not a quota: there is no shared counter, and identical requests are served from the CDN without reaching a function at all.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/llm-vram-fit": {
      "get": {
        "operationId": "llmVramFit",
        "summary": "Decide whether one LLM fits one accelerator, at every quantization.",
        "description": "The identical function that renders /lab/llm-vram/{model}/{gpu}. Returns one row per quantization (FP16 through Q3_K_M) with weight bytes and their basis, headroom, the largest context that fits, and the bandwidth-limited decode ceiling; plus the chosen best-fitting quant, the full-precision row, and a five-state verdict. Model geometry comes from each repo’s own config.json and tensor-shape index; accelerator capacity and bandwidth come from the site’s device table.\n\nNumbers that are not finite are encoded as the strings \"Infinity\", \"-Infinity\" and \"NaN\". These are real answers, not error states: a notch is −∞ dB at its centre frequency and a low-pass is −∞ dB at Nyquist. JSON has no numeric literal for them and `null` would be a different claim, so a string sentinel is the only encoding that does not lose the answer.",
        "parameters": [
          {
            "name": "model",
            "in": "query",
            "required": true,
            "description": "Model slug.",
            "schema": {
              "type": "string",
              "enum": [
                "deepseek-r1-distill-llama-70b",
                "deepseek-r1-distill-llama-8b",
                "deepseek-r1-distill-qwen-1-5b",
                "deepseek-r1-distill-qwen-14b",
                "deepseek-r1-distill-qwen-32b",
                "deepseek-r1-distill-qwen-7b",
                "dolphin-mistral-24b-venice-edition",
                "falcon3-7b-instruct",
                "gemma-2-27b-it",
                "gemma-2-9b-it",
                "gemma-3-12b-it",
                "gemma-3-1b-it",
                "gemma-3-27b-it",
                "gemma-3-4b-it",
                "gpt-oss-120b",
                "gpt-oss-20b",
                "granite-3-3-8b-instruct",
                "hermes-4-3-36b",
                "hy3",
                "kat-coder-v2-5-dev",
                "laguna-s-2-1",
                "laguna-xs-2-1",
                "llama-3-1-70b-instruct",
                "llama-3-1-8b-instruct",
                "llama-3-1-nemotron-70b-instruct",
                "llama-3-2-1b-instruct",
                "llama-3-2-3b-instruct",
                "llama-3-3-70b-instruct",
                "minicpm5-1b",
                "mistral-7b-instruct-v0-3",
                "mistral-nemo-instruct-2407",
                "mistral-small-24b-instruct-2501",
                "mixtral-8x7b-instruct-v0-1",
                "nanbeige4-2-3b",
                "olmo-2-1124-13b-instruct",
                "phi-3-5-mini-instruct",
                "phi-4",
                "phi-4-mini-instruct",
                "qwen-agentworld-35b-a3b",
                "qwen2-5-0-5b-instruct",
                "qwen2-5-1-5b-instruct",
                "qwen2-5-14b-instruct",
                "qwen2-5-32b-instruct",
                "qwen2-5-3b-instruct",
                "qwen2-5-72b-instruct",
                "qwen2-5-7b-instruct",
                "qwen2-5-coder-32b-instruct",
                "qwen2-5-coder-7b-instruct",
                "qwen3-0-6b",
                "qwen3-1-7b",
                "qwen3-14b",
                "qwen3-30b-a3b",
                "qwen3-32b",
                "qwen3-4b",
                "qwen3-8b",
                "qwq-32b",
                "qwythos-9b-claude-mythos-5-1m",
                "smollm2-1-7b-instruct",
                "smollm2-135m-instruct",
                "smollm2-360m-instruct",
                "tinyllama-1-1b-chat-v1-0",
                "yi-1-5-34b-chat"
              ]
            }
          },
          {
            "name": "gpu",
            "in": "query",
            "required": true,
            "description": "Accelerator slug.",
            "schema": {
              "type": "string",
              "enum": [
                "rtx-5090",
                "rtx-5080",
                "rtx-5070-ti",
                "rtx-4090",
                "rtx-4080-super",
                "rtx-4070-ti-super",
                "rtx-4060-ti-16gb",
                "rtx-3090",
                "rtx-3060-12gb",
                "rtx-6000-ada",
                "l40s",
                "a100-40gb",
                "a100-80gb",
                "h100-sxm",
                "h200-sxm",
                "rx-7900-xtx",
                "apple-m4-24gb",
                "apple-m4-pro-48gb",
                "apple-m4-max-128gb",
                "apple-m3-ultra-512gb",
                "jetson-orin-nano-super-8gb",
                "jetson-agx-orin-64gb"
              ]
            }
          },
          {
            "name": "context",
            "in": "query",
            "required": false,
            "description": "Context length in tokens used for the headline verdict. Omit it and the solver takes its own default of 8192, which is what the published page states.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000000,
              "default": 8192
            }
          },
          {
            "name": "kvBytes",
            "in": "query",
            "required": false,
            "description": "Bytes per KV cache element: 2 for FP16/BF16 cache, 1 for an 8-bit cache. Omit it for the published page's 2.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 4,
              "default": 2
            }
          },
          {
            "name": "batch",
            "in": "query",
            "required": false,
            "description": "Concurrent sequences sharing the cache. Omit it for the published page's 1.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1024,
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A solved answer, with provenance.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SolverEnvelope"
                },
                "example": {
                  "inputs": {
                    "model": "llama-3-1-8b-instruct",
                    "gpu": "rtx-4090",
                    "contextTokens": 8192,
                    "kvBytesPerElement": 2,
                    "batch": 1
                  },
                  "result": {
                    "model": {
                      "slug": "llama-3-1-8b-instruct",
                      "name": "Llama 3.1 8B Instruct",
                      "family": "Llama",
                      "repo": "unsloth/Meta-Llama-3.1-8B-Instruct",
                      "canonical": "meta-llama/Llama-3.1-8B-Instruct",
                      "modelType": "llama",
                      "params": 8030261248,
                      "parametersByDtype": {
                        "BF16": 8030261248
                      },
                      "checkpointBytes": 16060556376,
                      "checkpointFiles": 4,
                      "dtype": "BF16",
                      "layers": 32,
                      "hiddenSize": 4096,
                      "heads": 32,
                      "kvHeads": 8,
                      "headDim": 128,
                      "vocabSize": 128256,
                      "intermediateSize": 14336,
                      "maxPositionEmbeddings": 131072,
                      "tieWordEmbeddings": false,
                      "hasVisionTower": false,
                      "moe": null,
                      "sliding": null,
                      "downloads": 389806,
                      "likes": 98,
                      "sources": {
                        "params": "https://huggingface.co/api/models/unsloth/Meta-Llama-3.1-8B-Instruct",
                        "config": "https://huggingface.co/unsloth/Meta-Llama-3.1-8B-Instruct/resolve/main/config.json"
                      },
                      "gguf": {
                        "repo": "bartowski/Meta-Llama-3.1-8B-Instruct-GGUF",
                        "url": "https://huggingface.co/bartowski/Meta-Llama-3.1-8B-Instruct-GGUF",
                        "files": {
                          "Q3_K_M": {
                            "bytes": 4018922912,
                            "parts": 1
                          },
                          "Q4_K_M": {
                            "bytes": 4920739232,
                            "parts": 1
                          },
                          "Q5_K_M": {
                            "bytes": 5732992416,
                            "parts": 1
                          },
                          "Q6_K": {
                            "bytes": 6596011424,
                            "parts": 1
                          },
                          "Q8_0": {
                            "bytes": 8540775840,
                            "parts": 1
                          }
                        }
                      }
                    },
                    "gpu": {
                      "slug": "rtx-4090",
                      "name": "GeForce RTX 4090",
                      "serpName": "RTX 4090",
                      "vendor": "NVIDIA",
                      "memoryGiB": 24,
                      "memoryType": "GDDR6X",
                      "bandwidthGBs": 1008,
                      "bus": {
                        "bits": 384,
                        "dataRateGbps": 21
                      },
                      "memoryClass": "dedicated",
                      "segment": "consumer",
                      "year": 2022,
                      "sourceUrl": "https://www.nvidia.com/en-us/geforce/graphics-cards/40-series/rtx-4090/"
                    },
                    "usableBytes": 23708219473.920002,
                    "quants": [
                      {
                        "quant": {
                          "slug": "f16",
                          "label": "FP16 / BF16",
                          "bitsPerWeight": 16,
                          "exact": true,
                          "ggufToken": null,
                          "note": "Unquantized. Two bytes per parameter, exactly."
                        },
                        "weightBytes": 16060556376,
                        "weightBasis": "measured",
                        "bitsPerWeight": 16.00003375232656,
                        "headroomBytes": 7647663097.920002,
                        "fits": true,
                        "maxContextTokens": 58347,
                        "contextCappedByModel": false,
                        "ceilingTokensPerSecond": 58.829371838526775,
                        "bytesReadPerToken": 17134298200,
                        "counterfactualContextTokens": 8192,
                        "offloadBytes": 0,
                        "offloadCeilingTokensPerSecond": null
                      },
                      {
                        "quant": {
                          "slug": "q8_0",
                          "label": "Q8_0",
                          "bitsPerWeight": 8.5,
                          "exact": false,
                          "ggufToken": "Q8_0",
                          "note": "Effectively lossless; the usual reference point for quantized quality."
                        },
                        "weightBytes": 8540775840,
                        "weightBasis": "measured",
                        "bitsPerWeight": 8.508590768079578,
                        "headroomBytes": 15167443633.920002,
                        "fits": true,
                        "maxContextTokens": 115718,
                        "contextCappedByModel": false,
                        "ceilingTokensPerSecond": 104.84145281403895,
                        "bytesReadPerToken": 9614517664,
                        "counterfactualContextTokens": 8192,
                        "offloadBytes": 0,
                        "offloadCeilingTokensPerSecond": null
                      },
                      {
                        "quant": {
                          "slug": "q6_k",
                          "label": "Q6_K",
                          "bitsPerWeight": 6.56,
                          "exact": false,
                          "ggufToken": "Q6_K",
                          "note": "Quality loss is hard to measure on most benchmarks."
                        },
                        "weightBytes": 6596011424,
                        "weightBasis": "measured",
                        "bitsPerWeight": 6.571155005093055,
                        "headroomBytes": 17112208049.920002,
                        "fits": true,
                        "maxContextTokens": 130555,
                        "contextCappedByModel": false,
                        "ceilingTokensPerSecond": 131.4253493439115,
                        "bytesReadPerToken": 7669753248,
                        "counterfactualContextTokens": 8192,
                        "offloadBytes": 0,
                        "offloadCeilingTokensPerSecond": null
                      },
                      {
                        "quant": {
                          "slug": "q5_k_m",
                          "label": "Q5_K_M",
                          "bitsPerWeight": 5.67,
                          "exact": false,
                          "ggufToken": "Q5_K_M",
                          "note": "A middle point when Q4 fits with too little room for context."
                        },
                        "weightBytes": 5732992416,
                        "weightBasis": "measured",
                        "bitsPerWeight": 5.711388199160118,
                        "headroomBytes": 17975227057.920002,
                        "fits": true,
                        "maxContextTokens": 131072,
                        "contextCappedByModel": true,
                        "ceilingTokensPerSecond": 148.08863758429916,
                        "bytesReadPerToken": 6806734240,
                        "counterfactualContextTokens": 8192,
                        "offloadBytes": 0,
                        "offloadCeilingTokensPerSecond": null
                      },
                      {
                        "quant": {
                          "slug": "q4_k_m",
                          "label": "Q4_K_M",
                          "bitsPerWeight": 4.83,
                          "exact": false,
                          "ggufToken": "Q4_K_M",
                          "note": "The default choice for local inference — the best size/quality knee."
                        },
                        "weightBytes": 4920739232,
                        "weightBasis": "measured",
                        "bitsPerWeight": 4.902195911223236,
                        "headroomBytes": 18787480241.920002,
                        "fits": true,
                        "maxContextTokens": 131072,
                        "contextCappedByModel": true,
                        "ceilingTokensPerSecond": 168.15467270366497,
                        "bytesReadPerToken": 5994481056,
                        "counterfactualContextTokens": 8192,
                        "offloadBytes": 0,
                        "offloadCeilingTokensPerSecond": null
                      },
                      {
                        "quant": {
                          "slug": "q3_k_m",
                          "label": "Q3_K_M",
                          "bitsPerWeight": 3.91,
                          "exact": false,
                          "ggufToken": "Q3_K_M",
                          "note": "Measurable quality loss. Worth it only to make a model fit at all."
                        },
                        "weightBytes": 4018922912,
                        "weightBasis": "measured",
                        "bitsPerWeight": 4.0037779971364635,
                        "headroomBytes": 19689296561.920002,
                        "fits": true,
                        "maxContextTokens": 131072,
                        "contextCappedByModel": true,
                        "ceilingTokensPerSecond": 197.9317414858389,
                        "bytesReadPerToken": 5092664736,
                        "counterfactualContextTokens": 8192,
                        "offloadBytes": 0,
                        "offloadCeilingTokensPerSecond": null
                      }
                    ],
                    "best": {
                      "quant": {
                        "slug": "f16",
                        "label": "FP16 / BF16",
                        "bitsPerWeight": 16,
                        "exact": true,
                        "ggufToken": null,
                        "note": "Unquantized. Two bytes per parameter, exactly."
                      },
                      "weightBytes": 16060556376,
                      "weightBasis": "measured",
                      "bitsPerWeight": 16.00003375232656,
                      "headroomBytes": 7647663097.920002,
                      "fits": true,
                      "maxContextTokens": 58347,
                      "contextCappedByModel": false,
                      "ceilingTokensPerSecond": 58.829371838526775,
                      "bytesReadPerToken": 17134298200,
                      "counterfactualContextTokens": 8192,
                      "offloadBytes": 0,
                      "offloadCeilingTokensPerSecond": null
                    },
                    "fullPrecision": {
                      "quant": {
                        "slug": "f16",
                        "label": "FP16 / BF16",
                        "bitsPerWeight": 16,
                        "exact": true,
                        "ggufToken": null,
                        "note": "Unquantized. Two bytes per parameter, exactly."
                      },
                      "weightBytes": 16060556376,
                      "weightBasis": "measured",
                      "bitsPerWeight": 16.00003375232656,
                      "headroomBytes": 7647663097.920002,
                      "fits": true,
                      "maxContextTokens": 58347,
                      "contextCappedByModel": false,
                      "ceilingTokensPerSecond": 58.829371838526775,
                      "bytesReadPerToken": 17134298200,
                      "counterfactualContextTokens": 8192,
                      "offloadBytes": 0,
                      "offloadCeilingTokensPerSecond": null
                    },
                    "verdict": "comfortable"
                  },
                  "provenance": {
                    "method": "Weight bytes are the MEASURED size of a published GGUF file wherever one exists and params × bits/8 only where none does — the two differ by 33% on sub-1B models and by 89% on natively-quantized releases, so the basis travels with every figure. KV cache is layers × kv_heads × head_dim × 2 × bytes-per-element per token, honouring sliding-window layers. Usable VRAM is a fixed fraction of nameplate memory (different for dedicated and unified). The decode ceiling is bandwidth ÷ bytes-read-per-token, which no runtime beats.",
                    "canonicalUrl": "https://makerportal.ai/lab/llm-vram/llama-3-1-8b-instruct/rtx-4090"
                  },
                  "license": "free-with-attribution"
                }
              }
            }
          },
          "400": {
            "description": "A parameter was missing, unparseable or out of range. Never a 500.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Best-effort per-instance rate limit. Not a quota: there is no shared counter, and identical requests are served from the CDN without reaching a function at all.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/solenoid-field": {
      "get": {
        "operationId": "solenoidField",
        "summary": "Solve the on-axis magnetic field of an air-core solenoid.",
        "description": "The identical function that renders /lab/solenoid/{diameter}x{length}mm. Returns the centre field per amp-turn and at the requested turns and current, the on-axis profile out to three half-lengths, the span over which the field holds to within 1% and 5% of its centre value, the field at the coil mouth as a fraction of the centre, how far the infinite-solenoid shortcut mu0*n*I overstates the answer, and the turn count below which the closed form should not be used on this geometry. Dimensions are in millimetres. The field is exactly linear in turns x current, so only that product changes the answer.\n\nNumbers that are not finite are encoded as the strings \"Infinity\", \"-Infinity\" and \"NaN\". These are real answers, not error states: a notch is −∞ dB at its centre frequency and a low-pass is −∞ dB at Nyquist. JSON has no numeric literal for them and `null` would be a different claim, so a string sentinel is the only encoding that does not lose the answer.",
        "parameters": [
          {
            "name": "diameter",
            "in": "query",
            "required": true,
            "description": "Mean winding diameter in millimetres.",
            "schema": {
              "type": "number",
              "minimum": 0.1,
              "maximum": 2000
            }
          },
          {
            "name": "length",
            "in": "query",
            "required": true,
            "description": "Winding length along the axis, in millimetres.",
            "schema": {
              "type": "number",
              "minimum": 0.1,
              "maximum": 5000
            }
          },
          {
            "name": "turns",
            "in": "query",
            "required": false,
            "description": "Number of turns. Defaults to 1, which is what the published pages state (their figures are per amp-turn). The field is exactly linear in turns x current.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000000,
              "default": 1
            }
          },
          {
            "name": "current",
            "in": "query",
            "required": false,
            "description": "Winding current in amperes. Defaults to 1. Only the product of turns and current changes the answer.",
            "schema": {
              "type": "number",
              "minimum": 0.000001,
              "maximum": 10000,
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A solved answer, with provenance.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SolverEnvelope"
                },
                "example": {
                  "inputs": {
                    "diameterMm": 25,
                    "lengthMm": 100,
                    "turns": 1,
                    "currentA": 1,
                    "slug": "25x100mm"
                  },
                  "result": {
                    "spec": {
                      "diameterMm": 25,
                      "lengthMm": 100
                    },
                    "turns": 1,
                    "currentA": 1,
                    "ampTurns": 1,
                    "dims": {
                      "diameterM": 0.025,
                      "lengthM": 0.1,
                      "radiusM": 0.0125
                    },
                    "aspectRatio": 4,
                    "centreFieldT": 0.000012191170205567238,
                    "centreFieldPerAmpTurnT": 0.000012191170205567238,
                    "infiniteApproxPerAmpTurnT": 0.000012566370614359172,
                    "infiniteOverstatement": 0.030776406404415146,
                    "endFieldRatio": 0.5114083119567588,
                    "uniformSpans": [
                      {
                        "tolerance": 0.01,
                        "spanMm": 32.165207824350354,
                        "fractionOfLength": 0.3216520782435035
                      },
                      {
                        "tolerance": 0.05,
                        "spanMm": 58.704366536070275,
                        "fractionOfLength": 0.5870436653607027
                      }
                    ],
                    "profile": [
                      {
                        "zMm": 0,
                        "fieldT": 0.000012191170205567236,
                        "ofCentre": 0.9999999999999999,
                        "isMouth": false
                      },
                      {
                        "zMm": 12.5,
                        "fieldT": 0.00001212192305348308,
                        "ofCentre": 0.9943198929293485,
                        "isMouth": false
                      },
                      {
                        "zMm": 25,
                        "fieldT": 0.000011817547594145925,
                        "ofCentre": 0.9693530149180679,
                        "isMouth": false
                      },
                      {
                        "zMm": 37.50000000000001,
                        "fieldT": 0.000010662919051580076,
                        "ofCentre": 0.8746427842267949,
                        "isMouth": false
                      },
                      {
                        "zMm": 50,
                        "fieldT": 0.000006234665775606674,
                        "ofCentre": 0.5114083119567588,
                        "isMouth": true
                      },
                      {
                        "zMm": 75.00000000000001,
                        "fieldT": 6.32151268792083e-7,
                        "ofCentre": 0.05185320671705525,
                        "isMouth": false
                      },
                      {
                        "zMm": 100,
                        "fieldT": 1.6589656335274912e-7,
                        "ofCentre": 0.013607927750610073,
                        "isMouth": false
                      },
                      {
                        "zMm": 150.00000000000003,
                        "fieldT": 3.628352130971204e-8,
                        "ofCentre": 0.0029762131688673126,
                        "isMouth": false
                      }
                    ],
                    "workingPoints": [
                      {
                        "ampTurns": 100,
                        "fieldT": 0.0012191170205567239
                      },
                      {
                        "ampTurns": 500,
                        "fieldT": 0.006095585102783619
                      },
                      {
                        "ampTurns": 1000,
                        "fieldT": 0.012191170205567238
                      },
                      {
                        "ampTurns": 5000,
                        "fieldT": 0.06095585102783619
                      }
                    ],
                    "sheetFloor": {
                      "turns": 9,
                      "relativeErrorAtFloor": 0.006487905915032137,
                      "verifiedTo": 27
                    },
                    "mirror": {
                      "diameterMm": 100,
                      "lengthMm": 25
                    }
                  },
                  "provenance": {
                    "method": "Current-sheet solenoid solved in closed form, B(z) = (mu0*n*I/2)*[(L/2-z)/sqrt(R^2+(L/2-z)^2) + (L/2+z)/sqrt(R^2+(L/2+z)^2)], which at the centre reduces to mu0*N*I/sqrt(L^2+D^2). Air core (mu_r = 1), single layer, on-axis only. The turn-count floor below which the closed form is more than 1% from a real discrete winding is measured against an independent Biot-Savart sum over the individual turns, not against a rearrangement of the same formula. Pure mathematics - nothing is fetched and nothing is recalled.",
                    "canonicalUrl": "https://makerportal.ai/lab/solenoid/25x100mm"
                  },
                  "license": "free-with-attribution"
                }
              }
            }
          },
          "400": {
            "description": "A parameter was missing, unparseable or out of range. Never a 500.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Best-effort per-instance rate limit. Not a quota: there is no shared counter, and identical requests are served from the CDN without reaching a function at all.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/room-shape-band": {
      "get": {
        "operationId": "roomShapeBand",
        "summary": "Solve the best rectangular room proportions for a given volume.",
        "description": "The identical function that renders /lab/room-shape/{lo}-{hi}. Give a room volume in cubic feet and get the proportions to build: the length and width as multiples of the ceiling height, the exact dimensions at your volume, the widest axial gap they leave, and how far those proportions sit from a full solve at your exact volume. Also returns the band the volume falls in, that band's guarantee across its whole range, and which Bolt constraints are active at the answer. Five bands cover 800-5,000 cubic feet; a volume outside that range is refused rather than served from the nearest band.\n\nNumbers that are not finite are encoded as the strings \"Infinity\", \"-Infinity\" and \"NaN\". These are real answers, not error states: a notch is −∞ dB at its centre frequency and a low-pass is −∞ dB at Nyquist. JSON has no numeric literal for them and `null` would be a different claim, so a string sentinel is the only encoding that does not lose the answer.",
        "parameters": [
          {
            "name": "volume",
            "in": "query",
            "required": true,
            "description": "Room volume in cubic feet. Five bands cover 800–5000 ft³; anything outside that is a 400 naming the range, never an answer from the nearest band.",
            "schema": {
              "type": "number",
              "minimum": 1,
              "maximum": 1000000
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A solved answer, with provenance.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SolverEnvelope"
                },
                "example": {
                  "inputs": {
                    "volumeFt3": 2400,
                    "bandLoFt3": 1333,
                    "bandHiFt3": 2894,
                    "slug": "1333-2894"
                  },
                  "result": {
                    "band": {
                      "loFt3": 1333,
                      "hiFt3": 2894,
                      "ratio": {
                        "lengthOverHeight": 2.2466601562500004,
                        "widthOverHeight": 1.2813671874999994
                      },
                      "maxPenalty": 0.047238345894282885,
                      "worstRangeFt3": [
                        1333,
                        2550
                      ]
                    },
                    "slug": "1333-2894",
                    "reference": {
                      "volumeFt3": 2114,
                      "spec": {
                        "widthFt": 11.56036639819744,
                        "lengthFt": 20.269142859163097,
                        "heightFt": 9.02189981995106
                      },
                      "worstGapHz": 20.912440374282816,
                      "axialModeCount": 14
                    },
                    "bolt": {
                      "W/H>=1.0": 0.28136718749999945,
                      "W/H<=1.9": 0.6186328125000005,
                      "L/H>=1.1": 1.1466601562500003,
                      "L/H<=3.2": 0.9533398437499998,
                      "L>=1.05W": 0.9012246093750009,
                      "L<=2.6W": 1.0848945312499985,
                      "inBoltArea": true,
                      "activeConstraints": []
                    },
                    "atVolume": {
                      "volumeFt3": 2400,
                      "spec": {
                        "widthFt": 12.059806841640183,
                        "lengthFt": 21.14482701562402,
                        "heightFt": 9.411671345486353
                      },
                      "worstGapHz": 20.046380193456457,
                      "optimalSpec": {
                        "widthFt": 13.57005632590148,
                        "lengthFt": 16.038102916465803,
                        "heightFt": 11.027488038824787
                      },
                      "optimalWorstGapHz": 19.142137290950714,
                      "penalty": 0.047238345894280886
                    },
                    "verification": {
                      "agrees": true,
                      "forwardHz": 20.912440374282816,
                      "deltaHz": 0
                    }
                  },
                  "provenance": {
                    "method": "The inverse room problem: hold the volume, search the shape. Minimises the widest gap between adjacent axial modes below 200 Hz, over the Bolt (1946, JASA) ratio area, by a compass search seeded on a feasible grid — derivative-free because the objective has genuine jump discontinuities where a mode crosses the 200 Hz window. Axial modes are n*c/(2L) per axis at c = 343 m/s. The volume is a given and never a free variable: unconstrained, the objective is monotone in volume and the answer degenerates to \"build a bigger room\". The published answer is a BAND recommendation, one shape covering a range of volumes, with the range derived from a covering number rather than chosen. Pure mathematics - nothing is fetched and nothing is recalled.",
                    "canonicalUrl": "https://makerportal.ai/lab/room-shape/1333-2894"
                  },
                  "license": "free-with-attribution"
                }
              }
            }
          },
          "400": {
            "description": "A parameter was missing, unparseable or out of range. Never a 500.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Best-effort per-instance rate limit. Not a quota: there is no shared counter, and identical requests are served from the CDN without reaching a function at all.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "SolverEnvelope": {
        "type": "object",
        "required": [
          "inputs",
          "result",
          "provenance",
          "license"
        ],
        "properties": {
          "inputs": {
            "type": "object",
            "description": "The parsed inputs, echoed back with defaults filled in."
          },
          "result": {
            "type": "object",
            "description": "The solved analysis. Shape is per-endpoint; see the example."
          },
          "provenance": {
            "type": "object",
            "required": [
              "method",
              "canonicalUrl"
            ],
            "properties": {
              "method": {
                "type": "string",
                "description": "How the answer was computed, and what its inputs are."
              },
              "canonicalUrl": {
                "type": "string",
                "format": "uri",
                "description": "The published page for these exact inputs, or the lane hub when they are off-grid."
              }
            }
          },
          "license": {
            "type": "string",
            "enum": [
              "free-with-attribution"
            ]
          }
        }
      },
      "Error": {
        "type": "object",
        "required": [
          "error",
          "parameter"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "A sentence naming what was wrong."
          },
          "parameter": {
            "type": "string",
            "description": "The query parameter at fault."
          },
          "valid": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            },
            "description": "Every accepted value, when the parameter is an enumeration. Null otherwise."
          }
        }
      }
    }
  }
}
