{
  "openapi": "3.1.1",
  "info": {
    "title": "KlarFort Calculators",
    "version": "1.0.0",
    "description": "20 illustrative calculators. Free for personal, commercial and any other lawful use with credit to KlarFort at https://klarfort.com/. Third-party data terms still apply.",
    "license": {
      "name": "KlarFort free-tools permission",
      "url": "https://klarfort.com/tools/docs/license/"
    }
  },
  "servers": [
    {
      "url": "https://klarfort.com"
    }
  ],
  "paths": {
    "/tools/api/v1/cagr-calculator": {
      "get": {
        "operationId": "get_cagr_calculator",
        "summary": "Calculate compound annual growth and total return from starting and ending values, or solve for a future value, present value or investment duration.",
        "parameters": [
          {
            "name": "input",
            "in": "query",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/cagr-calculator"
                },
                "example": {
                  "currency": "USD",
                  "mode": "calculate",
                  "startValue": 10000,
                  "endValue": 20000,
                  "years": 10,
                  "annualReturn": 7
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Request limit"
          }
        }
      },
      "post": {
        "operationId": "post_cagr_calculator",
        "summary": "Calculate compound annual growth and total return from starting and ending values, or solve for a future value, present value or investment duration.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/cagr-calculator"
              },
              "example": {
                "currency": "USD",
                "mode": "calculate",
                "startValue": 10000,
                "endValue": 20000,
                "years": 10,
                "annualReturn": 7
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "413": {
            "description": "Input exceeds 16 KiB"
          },
          "429": {
            "description": "Request limit"
          }
        }
      }
    },
    "/tools/api/v1/car-loan-calculator": {
      "get": {
        "operationId": "get_car_loan_calculator",
        "summary": "Compare buying, leasing or keeping a car over the same period. Include loan payments, depreciation, negative equity and electric or petrol running costs.",
        "parameters": [
          {
            "name": "input",
            "in": "query",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/car-loan-calculator"
                },
                "example": {
                  "currency": "USD",
                  "purchasePrice": 30000,
                  "downPayment": 5000,
                  "annualRate": 6,
                  "loanMonths": 60,
                  "horizonMonths": 60,
                  "powertrain": "petrol",
                  "annualDepreciationPercent": 15,
                  "annualInsurance": 1200,
                  "annualMaintenance": 600,
                  "annualDistance": 15000,
                  "petrolLitresPer100": 7,
                  "petrolPrice": 1.5,
                  "evKWhPer100": 18,
                  "electricityPrice": 0.2,
                  "evPricePremium": 5000,
                  "chargerCost": 1000,
                  "currentCarValue": 10000,
                  "currentLoanBalance": 5000,
                  "currentLoanRate": 5,
                  "currentLoanMonths": 24,
                  "currentDepreciationPercent": 10,
                  "currentAnnualInsurance": 900,
                  "currentAnnualMaintenance": 1200,
                  "leaseMonthly": 450,
                  "leaseUpfront": 2000,
                  "leaseEndFee": 300,
                  "leaseAnnualDistance": 15000,
                  "leaseExcessDistanceFee": 0.15
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Request limit"
          }
        }
      },
      "post": {
        "operationId": "post_car_loan_calculator",
        "summary": "Compare buying, leasing or keeping a car over the same period. Include loan payments, depreciation, negative equity and electric or petrol running costs.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/car-loan-calculator"
              },
              "example": {
                "currency": "USD",
                "purchasePrice": 30000,
                "downPayment": 5000,
                "annualRate": 6,
                "loanMonths": 60,
                "horizonMonths": 60,
                "powertrain": "petrol",
                "annualDepreciationPercent": 15,
                "annualInsurance": 1200,
                "annualMaintenance": 600,
                "annualDistance": 15000,
                "petrolLitresPer100": 7,
                "petrolPrice": 1.5,
                "evKWhPer100": 18,
                "electricityPrice": 0.2,
                "evPricePremium": 5000,
                "chargerCost": 1000,
                "currentCarValue": 10000,
                "currentLoanBalance": 5000,
                "currentLoanRate": 5,
                "currentLoanMonths": 24,
                "currentDepreciationPercent": 10,
                "currentAnnualInsurance": 900,
                "currentAnnualMaintenance": 1200,
                "leaseMonthly": 450,
                "leaseUpfront": 2000,
                "leaseEndFee": 300,
                "leaseAnnualDistance": 15000,
                "leaseExcessDistanceFee": 0.15
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "413": {
            "description": "Input exceeds 16 KiB"
          },
          "429": {
            "description": "Request limit"
          }
        }
      }
    },
    "/tools/api/v1/compound-interest-calculator": {
      "get": {
        "operationId": "get_compound_interest_calculator",
        "summary": "Project lump-sum and monthly investment growth with compound interest. Include rising contributions, inflation and the first-million milestone.",
        "parameters": [
          {
            "name": "input",
            "in": "query",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/compound-interest-calculator"
                },
                "example": {
                  "currency": "USD",
                  "principal": 10000,
                  "months": 12,
                  "monthlyContribution": 0,
                  "annualReturn": 0,
                  "mode": "sip",
                  "contributionGrowth": 0,
                  "inflationRate": 0,
                  "startMonth": "2026-09"
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Request limit"
          }
        }
      },
      "post": {
        "operationId": "post_compound_interest_calculator",
        "summary": "Project lump-sum and monthly investment growth with compound interest. Include rising contributions, inflation and the first-million milestone.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/compound-interest-calculator"
              },
              "example": {
                "currency": "USD",
                "principal": 10000,
                "months": 12,
                "monthlyContribution": 0,
                "annualReturn": 0,
                "mode": "sip",
                "contributionGrowth": 0,
                "inflationRate": 0,
                "startMonth": "2026-09"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "413": {
            "description": "Input exceeds 16 KiB"
          },
          "429": {
            "description": "Request limit"
          }
        }
      }
    },
    "/tools/api/v1/crypto-converter": {
      "get": {
        "operationId": "get_crypto_converter",
        "summary": "Convert crypto to fiat or fiat to crypto after entered fees. Model regular purchases with an assumed price change in a forward DCA scenario.",
        "parameters": [
          {
            "name": "input",
            "in": "query",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/crypto-converter"
                },
                "example": {
                  "symbol": "BTC",
                  "currency": "USD",
                  "mode": "convert",
                  "direction": "coin-to-fiat",
                  "price": 50000,
                  "fxRate": 1,
                  "amount": 1,
                  "monthlyContribution": 100,
                  "months": 12,
                  "annualReturn": 0,
                  "feePercent": 0,
                  "initialInvestment": 0
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Request limit"
          }
        }
      },
      "post": {
        "operationId": "post_crypto_converter",
        "summary": "Convert crypto to fiat or fiat to crypto after entered fees. Model regular purchases with an assumed price change in a forward DCA scenario.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/crypto-converter"
              },
              "example": {
                "symbol": "BTC",
                "currency": "USD",
                "mode": "convert",
                "direction": "coin-to-fiat",
                "price": 50000,
                "fxRate": 1,
                "amount": 1,
                "monthlyContribution": 100,
                "months": 12,
                "annualReturn": 0,
                "feePercent": 0,
                "initialInvestment": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "413": {
            "description": "Input exceeds 16 KiB"
          },
          "429": {
            "description": "Request limit"
          }
        }
      }
    },
    "/tools/api/v1/crypto-trading-calculator": {
      "get": {
        "operationId": "get_crypto_trading_calculator",
        "summary": "Calculate crypto trade profit after fees, isolated liquidation estimates, position size and staking rewards. Convert nominal APR and effective APY.",
        "parameters": [
          {
            "name": "input",
            "in": "query",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/crypto-trading-calculator"
                },
                "example": {
                  "symbol": "BTC",
                  "mode": "profit-loss",
                  "side": "long",
                  "entryPrice": 50000,
                  "exitPrice": 55000,
                  "quantity": 1,
                  "entryFeePercent": 0.1,
                  "exitFeePercent": 0.1,
                  "fundingCost": 0,
                  "margin": 1000,
                  "leverage": 10,
                  "maintenanceMarginPercent": 0.5,
                  "accountEquity": 10000,
                  "riskPercent": 1,
                  "stopPrice": 45000,
                  "principal": 100,
                  "annualRate": 5,
                  "rateKind": "apr",
                  "compoundingPeriods": 12,
                  "months": 12,
                  "stakingFeePercent": 0
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Request limit"
          }
        }
      },
      "post": {
        "operationId": "post_crypto_trading_calculator",
        "summary": "Calculate crypto trade profit after fees, isolated liquidation estimates, position size and staking rewards. Convert nominal APR and effective APY.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/crypto-trading-calculator"
              },
              "example": {
                "symbol": "BTC",
                "mode": "profit-loss",
                "side": "long",
                "entryPrice": 50000,
                "exitPrice": 55000,
                "quantity": 1,
                "entryFeePercent": 0.1,
                "exitFeePercent": 0.1,
                "fundingCost": 0,
                "margin": 1000,
                "leverage": 10,
                "maintenanceMarginPercent": 0.5,
                "accountEquity": 10000,
                "riskPercent": 1,
                "stopPrice": 45000,
                "principal": 100,
                "annualRate": 5,
                "rateKind": "apr",
                "compoundingPeriods": 12,
                "months": 12,
                "stakingFeePercent": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "413": {
            "description": "Input exceeds 16 KiB"
          },
          "429": {
            "description": "Request limit"
          }
        }
      }
    },
    "/tools/api/v1/currency-converter": {
      "get": {
        "operationId": "get_currency_converter",
        "summary": "Convert currencies and check a transfer quote. Compare the reference rate, quoted rate and fee to see the amount received and effective exchange rate.",
        "parameters": [
          {
            "name": "input",
            "in": "query",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/currency-converter"
                },
                "example": {
                  "fromCurrency": "USD",
                  "toCurrency": "AED",
                  "amount": 1000,
                  "midMarketRate": 3.6725,
                  "quotedRate": 3.65,
                  "fee": 5,
                  "feeMode": "deducted"
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Request limit"
          }
        }
      },
      "post": {
        "operationId": "post_currency_converter",
        "summary": "Convert currencies and check a transfer quote. Compare the reference rate, quoted rate and fee to see the amount received and effective exchange rate.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/currency-converter"
              },
              "example": {
                "fromCurrency": "USD",
                "toCurrency": "AED",
                "amount": 1000,
                "midMarketRate": 3.6725,
                "quotedRate": 3.65,
                "fee": 5,
                "feeMode": "deducted"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "413": {
            "description": "Input exceeds 16 KiB"
          },
          "429": {
            "description": "Request limit"
          }
        }
      }
    },
    "/tools/api/v1/debt-payoff-calculator": {
      "get": {
        "operationId": "get_debt_payoff_calculator",
        "summary": "Compare debt avalanche, snowball and consolidation payoff plans. Include promotional rates, minimum payments, transfer fees and protected emergency cash.",
        "parameters": [
          {
            "name": "input",
            "in": "query",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/debt-payoff-calculator"
                },
                "example": {
                  "currency": "USD",
                  "debts": [
                    {
                      "balance": 5000,
                      "annualRate": 18,
                      "promoRate": 0,
                      "promoEndMonth": "",
                      "minimumType": "fixed",
                      "minimumPayment": 100,
                      "minimumPercent": 2,
                      "transferFeePercent": 0
                    },
                    {
                      "balance": 2000,
                      "annualRate": 12,
                      "promoRate": 0,
                      "promoEndMonth": "",
                      "minimumType": "fixed",
                      "minimumPayment": 50,
                      "minimumPercent": 2,
                      "transferFeePercent": 0
                    }
                  ],
                  "strategy": "avalanche",
                  "startMonth": "2026-09",
                  "monthlyBudget": 400,
                  "availableCash": 0,
                  "emergencyCashFloor": 0,
                  "maxMonths": 600,
                  "consolidationRate": 8,
                  "consolidationMonths": 36,
                  "consolidationFeePercent": 0
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Request limit"
          }
        }
      },
      "post": {
        "operationId": "post_debt_payoff_calculator",
        "summary": "Compare debt avalanche, snowball and consolidation payoff plans. Include promotional rates, minimum payments, transfer fees and protected emergency cash.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/debt-payoff-calculator"
              },
              "example": {
                "currency": "USD",
                "debts": [
                  {
                    "balance": 5000,
                    "annualRate": 18,
                    "promoRate": 0,
                    "promoEndMonth": "",
                    "minimumType": "fixed",
                    "minimumPayment": 100,
                    "minimumPercent": 2,
                    "transferFeePercent": 0
                  },
                  {
                    "balance": 2000,
                    "annualRate": 12,
                    "promoRate": 0,
                    "promoEndMonth": "",
                    "minimumType": "fixed",
                    "minimumPayment": 50,
                    "minimumPercent": 2,
                    "transferFeePercent": 0
                  }
                ],
                "strategy": "avalanche",
                "startMonth": "2026-09",
                "monthlyBudget": 400,
                "availableCash": 0,
                "emergencyCashFloor": 0,
                "maxMonths": 600,
                "consolidationRate": 8,
                "consolidationMonths": 36,
                "consolidationFeePercent": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "413": {
            "description": "Input exceeds 16 KiB"
          },
          "429": {
            "description": "Request limit"
          }
        }
      }
    },
    "/tools/api/v1/deposit-calculator": {
      "get": {
        "operationId": "get_deposit_calculator",
        "summary": "Calculate compound deposit interest after entered tax and withdrawal penalties. Compare a single deposit with an equally funded deposit ladder.",
        "parameters": [
          {
            "name": "input",
            "in": "query",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/deposit-calculator"
                },
                "example": {
                  "currency": "USD",
                  "principal": 10000,
                  "annualRate": 4,
                  "compoundsPerYear": 12,
                  "months": 12,
                  "taxPercent": 0,
                  "withdrawAfterMonths": 0,
                  "penaltyInterestMonths": 0,
                  "mode": "single",
                  "ladderRungs": 3,
                  "ladderSpacingMonths": 12,
                  "ladderRateStep": 0
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Request limit"
          }
        }
      },
      "post": {
        "operationId": "post_deposit_calculator",
        "summary": "Calculate compound deposit interest after entered tax and withdrawal penalties. Compare a single deposit with an equally funded deposit ladder.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/deposit-calculator"
              },
              "example": {
                "currency": "USD",
                "principal": 10000,
                "annualRate": 4,
                "compoundsPerYear": 12,
                "months": 12,
                "taxPercent": 0,
                "withdrawAfterMonths": 0,
                "penaltyInterestMonths": 0,
                "mode": "single",
                "ladderRungs": 3,
                "ladderSpacingMonths": 12,
                "ladderRateStep": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "413": {
            "description": "Input exceeds 16 KiB"
          },
          "429": {
            "description": "Request limit"
          }
        }
      }
    },
    "/tools/api/v1/dividend-calculator": {
      "get": {
        "operationId": "get_dividend_calculator",
        "summary": "Estimate dividend income, reinvestment growth and capital needed for an income target. Enter yield, dividend growth, price growth and dividend tax.",
        "parameters": [
          {
            "name": "input",
            "in": "query",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/dividend-calculator"
                },
                "example": {
                  "currency": "USD",
                  "mode": "projection",
                  "principal": 10000,
                  "months": 12,
                  "monthlyContribution": 0,
                  "monthlyIncomeTarget": 1000,
                  "dividendYield": 4,
                  "dividendGrowth": 0,
                  "priceGrowth": 0,
                  "taxRate": 0,
                  "reinvest": true
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Request limit"
          }
        }
      },
      "post": {
        "operationId": "post_dividend_calculator",
        "summary": "Estimate dividend income, reinvestment growth and capital needed for an income target. Enter yield, dividend growth, price growth and dividend tax.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/dividend-calculator"
              },
              "example": {
                "currency": "USD",
                "mode": "projection",
                "principal": 10000,
                "months": 12,
                "monthlyContribution": 0,
                "monthlyIncomeTarget": 1000,
                "dividendYield": 4,
                "dividendGrowth": 0,
                "priceGrowth": 0,
                "taxRate": 0,
                "reinvest": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "413": {
            "description": "Input exceeds 16 KiB"
          },
          "429": {
            "description": "Request limit"
          }
        }
      }
    },
    "/tools/api/v1/fire-calculator": {
      "get": {
        "operationId": "get_fire_calculator",
        "summary": "Estimate your financial independence target, saving timeline and Coast FIRE balance using spending, income, inflation and withdrawal assumptions.",
        "parameters": [
          {
            "name": "input",
            "in": "query",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/fire-calculator"
                },
                "example": {
                  "currency": "USD",
                  "mode": "standard",
                  "principal": 100000,
                  "monthlyExpenses": 2000,
                  "withdrawalRate": 4,
                  "annualReturn": 0,
                  "inflationRate": 0,
                  "savingMode": "amount",
                  "monthlyContribution": 1000,
                  "monthlyIncome": 5000,
                  "savingsRate": 20,
                  "monthlyBaristaIncome": 0,
                  "monthlyPension": 0,
                  "retirementMonths": 240,
                  "startMonth": "2026-09"
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Request limit"
          }
        }
      },
      "post": {
        "operationId": "post_fire_calculator",
        "summary": "Estimate your financial independence target, saving timeline and Coast FIRE balance using spending, income, inflation and withdrawal assumptions.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/fire-calculator"
              },
              "example": {
                "currency": "USD",
                "mode": "standard",
                "principal": 100000,
                "monthlyExpenses": 2000,
                "withdrawalRate": 4,
                "annualReturn": 0,
                "inflationRate": 0,
                "savingMode": "amount",
                "monthlyContribution": 1000,
                "monthlyIncome": 5000,
                "savingsRate": 20,
                "monthlyBaristaIncome": 0,
                "monthlyPension": 0,
                "retirementMonths": 240,
                "startMonth": "2026-09"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "413": {
            "description": "Input exceeds 16 KiB"
          },
          "429": {
            "description": "Request limit"
          }
        }
      }
    },
    "/tools/api/v1/inflation-calculator": {
      "get": {
        "operationId": "get_inflation_calculator",
        "summary": "Compare purchasing power between available years using national CPI data. Calculate equivalent amounts, cumulative inflation and annualized change.",
        "parameters": [
          {
            "name": "input",
            "in": "query",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/inflation-calculator"
                },
                "example": {
                  "amount": 1000,
                  "country": "USA",
                  "startYear": 2000,
                  "endYear": 2024
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Request limit"
          }
        }
      },
      "post": {
        "operationId": "post_inflation_calculator",
        "summary": "Compare purchasing power between available years using national CPI data. Calculate equivalent amounts, cumulative inflation and annualized change.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inflation-calculator"
              },
              "example": {
                "amount": 1000,
                "country": "USA",
                "startYear": 2000,
                "endYear": 2024
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "413": {
            "description": "Input exceeds 16 KiB"
          },
          "429": {
            "description": "Request limit"
          }
        }
      }
    },
    "/tools/api/v1/investment-growth-calculator": {
      "get": {
        "operationId": "get_investment_growth_calculator",
        "summary": "Compare gross, after-fee, after-tax and inflation-adjusted investment growth. Model contributions, withdrawals and a range of simulated outcomes.",
        "parameters": [
          {
            "name": "input",
            "in": "query",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/investment-growth-calculator"
                },
                "example": {
                  "currency": "USD",
                  "principal": 10000,
                  "months": 12,
                  "monthlyContribution": 0,
                  "annualReturn": 0,
                  "mode": "after-tax",
                  "monthlyWithdrawal": 0,
                  "annualVolatility": 0,
                  "annualFee": 0,
                  "taxRate": 0,
                  "inflationRate": 0,
                  "contributionGrowth": 0,
                  "paths": 1000,
                  "seed": "44af4bef64b738ab"
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Request limit"
          }
        }
      },
      "post": {
        "operationId": "post_investment_growth_calculator",
        "summary": "Compare gross, after-fee, after-tax and inflation-adjusted investment growth. Model contributions, withdrawals and a range of simulated outcomes.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/investment-growth-calculator"
              },
              "example": {
                "currency": "USD",
                "principal": 10000,
                "months": 12,
                "monthlyContribution": 0,
                "annualReturn": 0,
                "mode": "after-tax",
                "monthlyWithdrawal": 0,
                "annualVolatility": 0,
                "annualFee": 0,
                "taxRate": 0,
                "inflationRate": 0,
                "contributionGrowth": 0,
                "paths": 1000,
                "seed": "44af4bef64b738ab"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "413": {
            "description": "Input exceeds 16 KiB"
          },
          "429": {
            "description": "Request limit"
          }
        }
      }
    },
    "/tools/api/v1/loan-calculator": {
      "get": {
        "operationId": "get_loan_calculator",
        "summary": "Calculate monthly loan payments, total interest and payoff time. Compare flat and reducing interest, extra payments and an amortization schedule.",
        "parameters": [
          {
            "name": "input",
            "in": "query",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/loan-calculator"
                },
                "example": {
                  "currency": "USD",
                  "principal": 20000,
                  "annualRate": 6,
                  "months": 60,
                  "rateType": "reducing",
                  "extraMonthly": 0,
                  "lumpSum": 0,
                  "lumpSumMonth": 1,
                  "originationFee": 0
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Request limit"
          }
        }
      },
      "post": {
        "operationId": "post_loan_calculator",
        "summary": "Calculate monthly loan payments, total interest and payoff time. Compare flat and reducing interest, extra payments and an amortization schedule.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/loan-calculator"
              },
              "example": {
                "currency": "USD",
                "principal": 20000,
                "annualRate": 6,
                "months": 60,
                "rateType": "reducing",
                "extraMonthly": 0,
                "lumpSum": 0,
                "lumpSumMonth": 1,
                "originationFee": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "413": {
            "description": "Input exceeds 16 KiB"
          },
          "429": {
            "description": "Request limit"
          }
        }
      }
    },
    "/tools/api/v1/mortgage-calculator": {
      "get": {
        "operationId": "get_mortgage_calculator",
        "summary": "Estimate mortgage payments and total housing costs. Check after-tax affordability, deposit requirements, cash reserves and income-loss scenarios.",
        "parameters": [
          {
            "name": "input",
            "in": "query",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/mortgage-calculator"
                },
                "example": {
                  "currency": "USD",
                  "homePrice": 400000,
                  "downPayment": 80000,
                  "annualRate": 5,
                  "months": 300,
                  "afterTaxMonthlyIncome": 7000,
                  "monthlyLivingCosts": 2500,
                  "monthlySavings": 500,
                  "annualPropertyTax": 2400,
                  "annualInsurance": 1200,
                  "maintenancePercent": 1,
                  "monthlyServiceCharges": 150,
                  "cashSavings": 120000,
                  "closingCosts": 10000,
                  "reserveMonths": 6,
                  "jobLossMonths": 3,
                  "maxLoanToValuePercent": 80,
                  "stressRateIncrease": 2
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Request limit"
          }
        }
      },
      "post": {
        "operationId": "post_mortgage_calculator",
        "summary": "Estimate mortgage payments and total housing costs. Check after-tax affordability, deposit requirements, cash reserves and income-loss scenarios.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/mortgage-calculator"
              },
              "example": {
                "currency": "USD",
                "homePrice": 400000,
                "downPayment": 80000,
                "annualRate": 5,
                "months": 300,
                "afterTaxMonthlyIncome": 7000,
                "monthlyLivingCosts": 2500,
                "monthlySavings": 500,
                "annualPropertyTax": 2400,
                "annualInsurance": 1200,
                "maintenancePercent": 1,
                "monthlyServiceCharges": 150,
                "cashSavings": 120000,
                "closingCosts": 10000,
                "reserveMonths": 6,
                "jobLossMonths": 3,
                "maxLoanToValuePercent": 80,
                "stressRateIncrease": 2
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "413": {
            "description": "Input exceeds 16 KiB"
          },
          "429": {
            "description": "Request limit"
          }
        }
      }
    },
    "/tools/api/v1/net-worth-calculator": {
      "get": {
        "operationId": "get_net_worth_calculator",
        "summary": "Calculate assets minus debts with editable item lists. Optionally compare household net worth in 2022 US dollars with Survey of Consumer Finances data.",
        "parameters": [
          {
            "name": "input",
            "in": "query",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/net-worth-calculator"
                },
                "example": {
                  "currency": "USD",
                  "assets": [
                    {
                      "name": "Cash and investments",
                      "amount": 100000
                    },
                    {
                      "name": "Property",
                      "amount": 200000
                    }
                  ],
                  "liabilities": [
                    {
                      "name": "Mortgage and loans",
                      "amount": 100000
                    }
                  ],
                  "compareUS": false,
                  "ageGroup": "all"
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Request limit"
          }
        }
      },
      "post": {
        "operationId": "post_net_worth_calculator",
        "summary": "Calculate assets minus debts with editable item lists. Optionally compare household net worth in 2022 US dollars with Survey of Consumer Finances data.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/net-worth-calculator"
              },
              "example": {
                "currency": "USD",
                "assets": [
                  {
                    "name": "Cash and investments",
                    "amount": 100000
                  },
                  {
                    "name": "Property",
                    "amount": 200000
                  }
                ],
                "liabilities": [
                  {
                    "name": "Mortgage and loans",
                    "amount": 100000
                  }
                ],
                "compareUS": false,
                "ageGroup": "all"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "413": {
            "description": "Input exceeds 16 KiB"
          },
          "429": {
            "description": "Request limit"
          }
        }
      }
    },
    "/tools/api/v1/overpay-or-invest": {
      "get": {
        "operationId": "get_overpay_or_invest",
        "summary": "Compare mortgage overpayments with investing spare cash. See payoff dates, end wealth, liquidity and simulated outcomes using equal monthly budgets.",
        "parameters": [
          {
            "name": "input",
            "in": "query",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/overpay-or-invest"
                },
                "example": {
                  "currency": "USD",
                  "principal": 300000,
                  "homeValue": 400000,
                  "mortgageRate": 5,
                  "mortgageMonths": 300,
                  "extraMonthly": 500,
                  "horizonMonths": 300,
                  "investmentReturn": 6,
                  "volatility": 15,
                  "paths": 250,
                  "seed": "731f4821e09868c9",
                  "initialInvestment": 20000,
                  "protectedCash": 10000,
                  "overpaymentClosingCost": 0,
                  "monthlyMortgageInsurance": 0,
                  "insuranceRemovalLTV": 78
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Request limit"
          }
        }
      },
      "post": {
        "operationId": "post_overpay_or_invest",
        "summary": "Compare mortgage overpayments with investing spare cash. See payoff dates, end wealth, liquidity and simulated outcomes using equal monthly budgets.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/overpay-or-invest"
              },
              "example": {
                "currency": "USD",
                "principal": 300000,
                "homeValue": 400000,
                "mortgageRate": 5,
                "mortgageMonths": 300,
                "extraMonthly": 500,
                "horizonMonths": 300,
                "investmentReturn": 6,
                "volatility": 15,
                "paths": 250,
                "seed": "731f4821e09868c9",
                "initialInvestment": 20000,
                "protectedCash": 10000,
                "overpaymentClosingCost": 0,
                "monthlyMortgageInsurance": 0,
                "insuranceRemovalLTV": 78
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "413": {
            "description": "Input exceeds 16 KiB"
          },
          "429": {
            "description": "Request limit"
          }
        }
      }
    },
    "/tools/api/v1/rent-vs-buy-calculator": {
      "get": {
        "operationId": "get_rent_vs_buy_calculator",
        "summary": "Compare renting and buying over the same period, including mortgage costs, rent growth, home value changes, transaction costs and invested savings.",
        "parameters": [
          {
            "name": "input",
            "in": "query",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/rent-vs-buy-calculator"
                },
                "example": {
                  "currency": "USD",
                  "homePrice": 400000,
                  "downPayment": 80000,
                  "annualMortgageRate": 5,
                  "mortgageMonths": 300,
                  "horizonMonths": 120,
                  "buyingCostsPercent": 3,
                  "sellingCostsPercent": 3,
                  "homeAppreciation": 0,
                  "monthlyRent": 1800,
                  "rentGrowth": 0,
                  "investmentReturn": 0,
                  "annualPropertyTaxPercent": 0,
                  "annualMaintenancePercent": 1,
                  "annualHomeInsurance": 1200,
                  "monthlyServiceCharges": 150,
                  "annualRentersInsurance": 200,
                  "costInflation": 0
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Request limit"
          }
        }
      },
      "post": {
        "operationId": "post_rent_vs_buy_calculator",
        "summary": "Compare renting and buying over the same period, including mortgage costs, rent growth, home value changes, transaction costs and invested savings.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/rent-vs-buy-calculator"
              },
              "example": {
                "currency": "USD",
                "homePrice": 400000,
                "downPayment": 80000,
                "annualMortgageRate": 5,
                "mortgageMonths": 300,
                "horizonMonths": 120,
                "buyingCostsPercent": 3,
                "sellingCostsPercent": 3,
                "homeAppreciation": 0,
                "monthlyRent": 1800,
                "rentGrowth": 0,
                "investmentReturn": 0,
                "annualPropertyTaxPercent": 0,
                "annualMaintenancePercent": 1,
                "annualHomeInsurance": 1200,
                "monthlyServiceCharges": 150,
                "annualRentersInsurance": 200,
                "costInflation": 0
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "413": {
            "description": "Input exceeds 16 KiB"
          },
          "429": {
            "description": "Request limit"
          }
        }
      }
    },
    "/tools/api/v1/retirement-calculator": {
      "get": {
        "operationId": "get_retirement_calculator",
        "summary": "Project retirement savings with contributions, pension income, changing spending, inflation and withdrawals. Explore simulated balances and shortfall risk.",
        "parameters": [
          {
            "name": "input",
            "in": "query",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/retirement-calculator"
                },
                "example": {
                  "currency": "USD",
                  "principal": 10000,
                  "months": 12,
                  "monthlyContribution": 0,
                  "annualReturn": 0,
                  "retirementMonth": 1,
                  "monthlyExpenses": 1000,
                  "pensionStartMonth": 1,
                  "monthlyPension": 0,
                  "annualVolatility": 0,
                  "annualFee": 0,
                  "taxRate": 0,
                  "inflationRate": 0,
                  "paths": 1000,
                  "seed": "bcedbf7e441e38da",
                  "lifeStages": []
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Request limit"
          }
        }
      },
      "post": {
        "operationId": "post_retirement_calculator",
        "summary": "Project retirement savings with contributions, pension income, changing spending, inflation and withdrawals. Explore simulated balances and shortfall risk.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/retirement-calculator"
              },
              "example": {
                "currency": "USD",
                "principal": 10000,
                "months": 12,
                "monthlyContribution": 0,
                "annualReturn": 0,
                "retirementMonth": 1,
                "monthlyExpenses": 1000,
                "pensionStartMonth": 1,
                "monthlyPension": 0,
                "annualVolatility": 0,
                "annualFee": 0,
                "taxRate": 0,
                "inflationRate": 0,
                "paths": 1000,
                "seed": "bcedbf7e441e38da",
                "lifeStages": []
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "413": {
            "description": "Input exceeds 16 KiB"
          },
          "429": {
            "description": "Request limit"
          }
        }
      }
    },
    "/tools/api/v1/runway-calculator": {
      "get": {
        "operationId": "get_runway_calculator",
        "summary": "Estimate how long liquid savings cover expenses. Compare spending and income changes, job loss, a sabbatical and simulated cash drawdown.",
        "parameters": [
          {
            "name": "input",
            "in": "query",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runway-calculator"
                },
                "example": {
                  "currency": "USD",
                  "mode": "scenarios",
                  "scenario": "current",
                  "liquidAssets": 12000,
                  "monthlyIncome": 2000,
                  "monthlyExpenses": 3000,
                  "obligationsDue12Months": 0,
                  "leaveMonths": 6,
                  "incomeDuringLeave": 0,
                  "horizonMonths": 120,
                  "variancePercent": 10,
                  "paths": 1000,
                  "seed": "6d43b8fa7170a06d"
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Request limit"
          }
        }
      },
      "post": {
        "operationId": "post_runway_calculator",
        "summary": "Estimate how long liquid savings cover expenses. Compare spending and income changes, job loss, a sabbatical and simulated cash drawdown.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/runway-calculator"
              },
              "example": {
                "currency": "USD",
                "mode": "scenarios",
                "scenario": "current",
                "liquidAssets": 12000,
                "monthlyIncome": 2000,
                "monthlyExpenses": 3000,
                "obligationsDue12Months": 0,
                "leaveMonths": 6,
                "incomeDuringLeave": 0,
                "horizonMonths": 120,
                "variancePercent": 10,
                "paths": 1000,
                "seed": "6d43b8fa7170a06d"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "413": {
            "description": "Input exceeds 16 KiB"
          },
          "429": {
            "description": "Request limit"
          }
        }
      }
    },
    "/tools/api/v1/savings-goal-calculator": {
      "get": {
        "operationId": "get_savings_goal_calculator",
        "summary": "Find the monthly saving needed for a goal or estimate how long it will take. Include existing savings, assumed returns and a 50/30/20 budget illustration.",
        "parameters": [
          {
            "name": "input",
            "in": "query",
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/savings-goal-calculator"
                },
                "example": {
                  "currency": "USD",
                  "principal": 10000,
                  "months": 12,
                  "monthlyContribution": 0,
                  "annualReturn": 0,
                  "mode": "required-monthly",
                  "goal": 50000,
                  "monthlyIncome": 5000
                }
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Request limit"
          }
        }
      },
      "post": {
        "operationId": "post_savings_goal_calculator",
        "summary": "Find the monthly saving needed for a goal or estimate how long it will take. Include existing savings, assumed returns and a 50/30/20 budget illustration.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/savings-goal-calculator"
              },
              "example": {
                "currency": "USD",
                "principal": 10000,
                "months": 12,
                "monthlyContribution": 0,
                "annualReturn": 0,
                "mode": "required-monthly",
                "goal": 50000,
                "monthlyIncome": 5000
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculated result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "413": {
            "description": "Input exceeds 16 KiB"
          },
          "429": {
            "description": "Request limit"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "cagr-calculator": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "currency": {
            "type": "string",
            "title": "Currency",
            "description": "Currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "CNY",
              "INR",
              "MXN",
              "BRL",
              "SGD",
              "HKD",
              "SEK",
              "NOK",
              "DKK",
              "NZD",
              "ZAR",
              "KRW",
              "TRY",
              "PLN",
              "CZK",
              "HUF",
              "AED",
              "THB",
              "IDR",
              "MYR",
              "PHP"
            ],
            "default": "USD"
          },
          "mode": {
            "type": "string",
            "title": "Calculation mode",
            "description": "Calculation mode",
            "enum": [
              "calculate",
              "future-value",
              "present-value",
              "years"
            ],
            "default": "calculate"
          },
          "startValue": {
            "type": "number",
            "title": "Starting value",
            "description": "Starting value",
            "default": 10000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "endValue": {
            "type": "number",
            "title": "Ending value",
            "description": "Ending value",
            "default": 20000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "years": {
            "type": "number",
            "title": "Years",
            "description": "Years",
            "default": 10,
            "minimum": 0.000001,
            "maximum": 100
          },
          "annualReturn": {
            "type": "number",
            "title": "Annual growth rate (%)",
            "description": "Annual growth rate (%)",
            "default": 7,
            "minimum": -99,
            "maximum": 100
          }
        },
        "required": [
          "currency",
          "mode",
          "startValue",
          "endValue",
          "years",
          "annualReturn"
        ]
      },
      "car-loan-calculator": {
        "title": "Car loan, lease and ownership calculator",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "currency": {
            "type": "string",
            "title": "Currency",
            "description": "Currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "CNY",
              "INR",
              "MXN",
              "BRL",
              "SGD",
              "HKD",
              "SEK",
              "NOK",
              "DKK",
              "NZD",
              "ZAR",
              "KRW",
              "TRY",
              "PLN",
              "CZK",
              "HUF",
              "AED",
              "THB",
              "IDR",
              "MYR",
              "PHP"
            ],
            "default": "USD"
          },
          "purchasePrice": {
            "type": "number",
            "title": "Petrol vehicle purchase price",
            "description": "Petrol vehicle purchase price",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 30000
          },
          "downPayment": {
            "type": "number",
            "title": "Cash deposit",
            "description": "Cash deposit",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 5000
          },
          "annualRate": {
            "type": "number",
            "title": "Annual interest rate (%)",
            "description": "Annual interest rate (%)",
            "minimum": 0,
            "maximum": 100,
            "default": 6
          },
          "loanMonths": {
            "type": "integer",
            "title": "New vehicle loan months",
            "description": "New vehicle loan months",
            "minimum": 1,
            "maximum": 600,
            "default": 60
          },
          "horizonMonths": {
            "type": "integer",
            "title": "Comparison horizon months",
            "description": "Comparison horizon months",
            "minimum": 1,
            "maximum": 600,
            "default": 60
          },
          "powertrain": {
            "type": "string",
            "title": "Vehicle for buy and lease comparison",
            "description": "Vehicle for buy and lease comparison",
            "enum": [
              "petrol",
              "ev"
            ],
            "default": "petrol"
          },
          "annualDepreciationPercent": {
            "type": "number",
            "title": "New vehicle annual depreciation (%)",
            "description": "New vehicle annual depreciation (%)",
            "minimum": 0,
            "maximum": 100,
            "default": 15
          },
          "annualInsurance": {
            "type": "number",
            "title": "New vehicle annual insurance",
            "description": "New vehicle annual insurance",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 1200
          },
          "annualMaintenance": {
            "type": "number",
            "title": "New vehicle annual maintenance",
            "description": "New vehicle annual maintenance",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 600
          },
          "annualDistance": {
            "type": "number",
            "title": "Annual distance (km)",
            "description": "Annual distance (km)",
            "minimum": 0,
            "maximum": 1000000,
            "default": 15000
          },
          "petrolLitresPer100": {
            "type": "number",
            "title": "Petrol litres per 100 km",
            "description": "Petrol litres per 100 km",
            "minimum": 0,
            "maximum": 100,
            "default": 7
          },
          "petrolPrice": {
            "type": "number",
            "title": "Petrol price per litre",
            "description": "Petrol price per litre",
            "minimum": 0,
            "maximum": 100,
            "default": 1.5
          },
          "evKWhPer100": {
            "type": "number",
            "title": "EV kWh per 100 km",
            "description": "EV kWh per 100 km",
            "minimum": 0,
            "maximum": 200,
            "default": 18
          },
          "electricityPrice": {
            "type": "number",
            "title": "Electricity price per kWh",
            "description": "Electricity price per kWh",
            "minimum": 0,
            "maximum": 100,
            "default": 0.2
          },
          "evPricePremium": {
            "type": "number",
            "title": "EV price difference above petrol",
            "description": "EV price difference above petrol",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 5000
          },
          "chargerCost": {
            "type": "number",
            "title": "Upfront EV charger cost",
            "description": "Upfront EV charger cost",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 1000
          },
          "currentCarValue": {
            "type": "number",
            "title": "Current car trade-in value",
            "description": "Current car trade-in value",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 10000
          },
          "currentLoanBalance": {
            "type": "number",
            "title": "Current car loan balance",
            "description": "Current car loan balance",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 5000
          },
          "currentLoanRate": {
            "type": "number",
            "title": "Current car annual loan rate (%)",
            "description": "Current car annual loan rate (%)",
            "minimum": 0,
            "maximum": 100,
            "default": 5
          },
          "currentLoanMonths": {
            "type": "integer",
            "title": "Current loan remaining months",
            "description": "Current loan remaining months",
            "minimum": 1,
            "maximum": 600,
            "default": 24
          },
          "currentDepreciationPercent": {
            "type": "number",
            "title": "Current car annual depreciation (%)",
            "description": "Current car annual depreciation (%)",
            "minimum": 0,
            "maximum": 100,
            "default": 10
          },
          "currentAnnualInsurance": {
            "type": "number",
            "title": "Current car annual insurance",
            "description": "Current car annual insurance",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 900
          },
          "currentAnnualMaintenance": {
            "type": "number",
            "title": "Current car annual maintenance",
            "description": "Current car annual maintenance",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 1200
          },
          "leaseMonthly": {
            "type": "number",
            "title": "Monthly lease quote for this horizon",
            "description": "Monthly lease quote for this horizon",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 450
          },
          "leaseUpfront": {
            "type": "number",
            "title": "Lease upfront payment",
            "description": "Lease upfront payment",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 2000
          },
          "leaseEndFee": {
            "type": "number",
            "title": "Lease end fee",
            "description": "Lease end fee",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 300
          },
          "leaseAnnualDistance": {
            "type": "number",
            "title": "Lease annual km allowance",
            "description": "Lease annual km allowance",
            "minimum": 0,
            "maximum": 1000000,
            "default": 15000
          },
          "leaseExcessDistanceFee": {
            "type": "number",
            "title": "Lease charge per excess km",
            "description": "Lease charge per excess km",
            "minimum": 0,
            "maximum": 100,
            "default": 0.15
          }
        },
        "required": [
          "currency",
          "purchasePrice",
          "downPayment",
          "annualRate",
          "loanMonths",
          "horizonMonths",
          "powertrain",
          "annualDepreciationPercent",
          "annualInsurance",
          "annualMaintenance",
          "annualDistance",
          "petrolLitresPer100",
          "petrolPrice",
          "evKWhPer100",
          "electricityPrice",
          "evPricePremium",
          "chargerCost",
          "currentCarValue",
          "currentLoanBalance",
          "currentLoanRate",
          "currentLoanMonths",
          "currentDepreciationPercent",
          "currentAnnualInsurance",
          "currentAnnualMaintenance",
          "leaseMonthly",
          "leaseUpfront",
          "leaseEndFee",
          "leaseAnnualDistance",
          "leaseExcessDistanceFee"
        ]
      },
      "compound-interest-calculator": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "currency": {
            "type": "string",
            "title": "Currency",
            "description": "Currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "CNY",
              "INR",
              "MXN",
              "BRL",
              "SGD",
              "HKD",
              "SEK",
              "NOK",
              "DKK",
              "NZD",
              "ZAR",
              "KRW",
              "TRY",
              "PLN",
              "CZK",
              "HUF",
              "AED",
              "THB",
              "IDR",
              "MYR",
              "PHP"
            ],
            "default": "USD"
          },
          "principal": {
            "type": "number",
            "title": "Starting balance",
            "description": "Starting balance",
            "default": 10000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "months": {
            "type": "integer",
            "title": "Projection months",
            "description": "Projection months",
            "default": 12,
            "minimum": 1,
            "maximum": 600
          },
          "monthlyContribution": {
            "type": "number",
            "title": "Monthly contribution",
            "description": "Monthly contribution",
            "default": 0,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "annualReturn": {
            "type": "number",
            "title": "Annual return (%)",
            "description": "Annual return (%)",
            "default": 0,
            "minimum": -99,
            "maximum": 100
          },
          "mode": {
            "type": "string",
            "title": "Contribution mode",
            "description": "Contribution mode",
            "enum": [
              "sip",
              "lump-sum"
            ],
            "default": "sip"
          },
          "contributionGrowth": {
            "type": "number",
            "title": "Annual contribution growth (%)",
            "description": "Annual contribution growth (%)",
            "default": 0,
            "minimum": -99,
            "maximum": 100
          },
          "inflationRate": {
            "type": "number",
            "title": "Annual inflation (%)",
            "description": "Annual inflation (%)",
            "default": 0,
            "minimum": -99,
            "maximum": 100
          },
          "startMonth": {
            "type": "string",
            "title": "Starting month",
            "description": "Starting month for the projected milestone date, in YYYY-MM format.",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
            "default": "2026-09"
          }
        },
        "required": [
          "currency",
          "principal",
          "months",
          "monthlyContribution",
          "annualReturn",
          "mode",
          "contributionGrowth",
          "inflationRate",
          "startMonth"
        ]
      },
      "crypto-converter": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "symbol": {
            "type": "string",
            "title": "Coin",
            "description": "A supported symbol; arithmetic uses the price you enter.",
            "enum": [
              "BTC",
              "ETH",
              "USDT",
              "BNB",
              "SOL",
              "USDC",
              "XRP",
              "ADA",
              "DOGE",
              "TRX",
              "AVAX",
              "SHIB",
              "DOT",
              "LINK",
              "MATIC",
              "LTC",
              "BCH",
              "ATOM",
              "UNI",
              "NEAR",
              "APT",
              "ARB",
              "OP",
              "STX",
              "ICP",
              "INJ",
              "FIL",
              "HBAR",
              "IMX",
              "RUNE",
              "VET",
              "MKR",
              "GRT",
              "ALGO",
              "SAND",
              "EOS",
              "AAVE",
              "THETA",
              "AXS",
              "CRV",
              "MANA",
              "SUI",
              "FTM",
              "XLM",
              "APE",
              "CHZ",
              "FLOW",
              "EGLD",
              "DAI",
              "WBTC"
            ],
            "default": "BTC"
          },
          "currency": {
            "type": "string",
            "title": "Currency",
            "description": "All entered amounts use this currency. No automatic currency conversion.",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "CNY",
              "INR",
              "MXN",
              "BRL",
              "SGD",
              "HKD",
              "SEK",
              "NOK",
              "DKK",
              "NZD",
              "ZAR",
              "KRW",
              "TRY",
              "PLN",
              "CZK",
              "HUF",
              "AED",
              "THB",
              "IDR",
              "MYR",
              "PHP"
            ],
            "default": "USD"
          },
          "mode": {
            "type": "string",
            "title": "Mode",
            "description": "Mode",
            "enum": [
              "convert",
              "dca"
            ],
            "default": "convert"
          },
          "direction": {
            "type": "string",
            "title": "Conversion direction",
            "description": "Conversion direction",
            "enum": [
              "coin-to-fiat",
              "fiat-to-coin"
            ],
            "default": "coin-to-fiat"
          },
          "price": {
            "type": "number",
            "title": "Coin price in USD",
            "description": "Your entered USD price, or an indicative quote when available.",
            "default": 50000,
            "minimum": 1e-9,
            "maximum": 1000000000
          },
          "fxRate": {
            "type": "number",
            "title": "Fiat units per US dollar",
            "description": "One for USD. Other currencies require your entered conversion rate.",
            "default": 1,
            "minimum": 1e-9,
            "maximum": 1000000000
          },
          "amount": {
            "type": "number",
            "title": "Amount to convert",
            "description": "Amount to convert",
            "default": 1,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "monthlyContribution": {
            "type": "number",
            "title": "Monthly DCA contribution in fiat",
            "description": "Monthly DCA contribution in fiat",
            "default": 100,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "months": {
            "type": "integer",
            "title": "DCA duration in months",
            "description": "DCA duration in months",
            "default": 12,
            "minimum": 1,
            "maximum": 600
          },
          "annualReturn": {
            "type": "number",
            "title": "Assumed annual coin price change (%)",
            "description": "Assumed annual coin price change (%)",
            "default": 0,
            "minimum": -99,
            "maximum": 100
          },
          "feePercent": {
            "type": "number",
            "title": "Purchase or sale fee (%)",
            "description": "Purchase or sale fee (%)",
            "default": 0,
            "minimum": 0,
            "maximum": 99
          },
          "initialInvestment": {
            "type": "number",
            "title": "Initial DCA investment in fiat",
            "description": "Invested at the entered initial price, before monthly purchases.",
            "default": 0,
            "minimum": 0,
            "maximum": 1000000000000
          }
        },
        "required": [
          "symbol",
          "currency",
          "mode",
          "direction",
          "price",
          "fxRate",
          "amount",
          "monthlyContribution",
          "months",
          "annualReturn",
          "feePercent",
          "initialInvestment"
        ]
      },
      "crypto-trading-calculator": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "symbol": {
            "type": "string",
            "title": "Coin",
            "description": "A supported symbol; arithmetic uses the price you enter.",
            "enum": [
              "BTC",
              "ETH",
              "USDT",
              "BNB",
              "SOL",
              "USDC",
              "XRP",
              "ADA",
              "DOGE",
              "TRX",
              "AVAX",
              "SHIB",
              "DOT",
              "LINK",
              "MATIC",
              "LTC",
              "BCH",
              "ATOM",
              "UNI",
              "NEAR",
              "APT",
              "ARB",
              "OP",
              "STX",
              "ICP",
              "INJ",
              "FIL",
              "HBAR",
              "IMX",
              "RUNE",
              "VET",
              "MKR",
              "GRT",
              "ALGO",
              "SAND",
              "EOS",
              "AAVE",
              "THETA",
              "AXS",
              "CRV",
              "MANA",
              "SUI",
              "FTM",
              "XLM",
              "APE",
              "CHZ",
              "FLOW",
              "EGLD",
              "DAI",
              "WBTC"
            ],
            "default": "BTC"
          },
          "mode": {
            "type": "string",
            "title": "Mode",
            "description": "Mode",
            "enum": [
              "profit-loss",
              "liquidation",
              "position-size",
              "staking",
              "apy"
            ],
            "default": "profit-loss"
          },
          "side": {
            "type": "string",
            "title": "Position direction",
            "description": "Position direction",
            "enum": [
              "long",
              "short"
            ],
            "default": "long"
          },
          "entryPrice": {
            "type": "number",
            "title": "Entry price in USD",
            "description": "Entry price in USD",
            "default": 50000,
            "minimum": 1e-9,
            "maximum": 1000000000
          },
          "exitPrice": {
            "type": "number",
            "title": "Exit price in USD",
            "description": "Exit price in USD",
            "default": 55000,
            "minimum": 0,
            "maximum": 1000000000
          },
          "quantity": {
            "type": "number",
            "title": "Coin quantity",
            "description": "Coin quantity",
            "default": 1,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "entryFeePercent": {
            "type": "number",
            "title": "Entry fee (%)",
            "description": "Entry fee (%)",
            "default": 0.1,
            "minimum": 0,
            "maximum": 10
          },
          "exitFeePercent": {
            "type": "number",
            "title": "Exit or liquidation closing fee (%)",
            "description": "Exit or liquidation closing fee (%)",
            "default": 0.1,
            "minimum": 0,
            "maximum": 10
          },
          "fundingCost": {
            "type": "number",
            "title": "Net funding cost in USD",
            "description": "Positive is a payment; negative is a funding credit.",
            "default": 0,
            "minimum": -1000000000,
            "maximum": 1000000000
          },
          "margin": {
            "type": "number",
            "title": "Isolated margin in USD",
            "description": "Isolated margin in USD",
            "default": 1000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "leverage": {
            "type": "number",
            "title": "Leverage multiple",
            "description": "Leverage multiple",
            "default": 10,
            "minimum": 1,
            "maximum": 100
          },
          "maintenanceMarginPercent": {
            "type": "number",
            "title": "Maintenance margin (%)",
            "description": "Maintenance margin (%)",
            "default": 0.5,
            "minimum": 0,
            "maximum": 50
          },
          "accountEquity": {
            "type": "number",
            "title": "Account equity in USD",
            "description": "Account equity in USD",
            "default": 10000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "riskPercent": {
            "type": "number",
            "title": "Risk budget (%)",
            "description": "Risk budget (%)",
            "default": 1,
            "minimum": 0.001,
            "maximum": 100
          },
          "stopPrice": {
            "type": "number",
            "title": "Stop price in USD",
            "description": "Stop price in USD",
            "default": 45000,
            "minimum": 1e-9,
            "maximum": 1000000000
          },
          "principal": {
            "type": "number",
            "title": "Coins staked",
            "description": "Coins staked",
            "default": 100,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "annualRate": {
            "type": "number",
            "title": "Annual rate (%)",
            "description": "Annual rate (%)",
            "default": 5,
            "minimum": -99,
            "maximum": 1000
          },
          "rateKind": {
            "type": "string",
            "title": "Annual rate type",
            "description": "Annual rate type",
            "enum": [
              "apr",
              "apy"
            ],
            "default": "apr"
          },
          "compoundingPeriods": {
            "type": "integer",
            "title": "Compounds per year",
            "description": "Compounds per year",
            "default": 12,
            "minimum": 1,
            "maximum": 365
          },
          "months": {
            "type": "integer",
            "title": "Staking duration in months",
            "description": "Staking duration in months",
            "default": 12,
            "minimum": 1,
            "maximum": 600
          },
          "stakingFeePercent": {
            "type": "number",
            "title": "Fee on positive staking rewards (%)",
            "description": "Fee on positive staking rewards (%)",
            "default": 0,
            "minimum": 0,
            "maximum": 100
          }
        },
        "required": [
          "symbol",
          "mode",
          "side",
          "entryPrice",
          "exitPrice",
          "quantity",
          "entryFeePercent",
          "exitFeePercent",
          "fundingCost",
          "margin",
          "leverage",
          "maintenanceMarginPercent",
          "accountEquity",
          "riskPercent",
          "stopPrice",
          "principal",
          "annualRate",
          "rateKind",
          "compoundingPeriods",
          "months",
          "stakingFeePercent"
        ]
      },
      "currency-converter": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "fromCurrency": {
            "type": "string",
            "title": "From currency",
            "description": "From currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "CNY",
              "INR",
              "MXN",
              "BRL",
              "SGD",
              "HKD",
              "SEK",
              "NOK",
              "DKK",
              "NZD",
              "ZAR",
              "KRW",
              "TRY",
              "PLN",
              "CZK",
              "HUF",
              "AED",
              "THB",
              "IDR",
              "MYR",
              "PHP"
            ],
            "default": "USD"
          },
          "toCurrency": {
            "type": "string",
            "title": "To currency",
            "description": "To currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "CNY",
              "INR",
              "MXN",
              "BRL",
              "SGD",
              "HKD",
              "SEK",
              "NOK",
              "DKK",
              "NZD",
              "ZAR",
              "KRW",
              "TRY",
              "PLN",
              "CZK",
              "HUF",
              "AED",
              "THB",
              "IDR",
              "MYR",
              "PHP"
            ],
            "default": "AED"
          },
          "amount": {
            "type": "number",
            "title": "Transfer amount",
            "description": "Transfer amount",
            "default": 1000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "midMarketRate": {
            "type": "number",
            "title": "Reference rate",
            "description": "Target currency units per one source currency unit; indicative only.",
            "default": 3.6725,
            "minimum": 1e-9,
            "maximum": 1000000000
          },
          "quotedRate": {
            "type": "number",
            "title": "Rate you were quoted",
            "description": "Target currency units per one source currency unit.",
            "default": 3.65,
            "minimum": 1e-9,
            "maximum": 1000000000
          },
          "fee": {
            "type": "number",
            "title": "Transfer fee in source currency",
            "description": "Transfer fee in source currency",
            "default": 5,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "feeMode": {
            "type": "string",
            "title": "How the fee is paid",
            "description": "Deducted: fee comes out of the entered amount. Added: fee is paid on top.",
            "enum": [
              "deducted",
              "added"
            ],
            "default": "deducted"
          }
        },
        "required": [
          "fromCurrency",
          "toCurrency",
          "amount",
          "midMarketRate",
          "quotedRate",
          "fee",
          "feeMode"
        ]
      },
      "debt-payoff-calculator": {
        "title": "Debt payoff calculator",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "currency": {
            "type": "string",
            "title": "Currency",
            "description": "Currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "CNY",
              "INR",
              "MXN",
              "BRL",
              "SGD",
              "HKD",
              "SEK",
              "NOK",
              "DKK",
              "NZD",
              "ZAR",
              "KRW",
              "TRY",
              "PLN",
              "CZK",
              "HUF",
              "AED",
              "THB",
              "IDR",
              "MYR",
              "PHP"
            ],
            "default": "USD"
          },
          "debts": {
            "type": "array",
            "title": "Debts",
            "description": "Balances and entered minimum formulas; promotion ends at the start of its YYYY-MM expiry month.",
            "minItems": 1,
            "maxItems": 30,
            "default": [
              {
                "balance": 5000,
                "annualRate": 18,
                "promoRate": 0,
                "promoEndMonth": "",
                "minimumType": "fixed",
                "minimumPayment": 100,
                "minimumPercent": 2,
                "transferFeePercent": 0
              },
              {
                "balance": 2000,
                "annualRate": 12,
                "promoRate": 0,
                "promoEndMonth": "",
                "minimumType": "fixed",
                "minimumPayment": 50,
                "minimumPercent": 2,
                "transferFeePercent": 0
              }
            ],
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "balance": {
                  "type": "number",
                  "title": "Balance",
                  "description": "Balance",
                  "minimum": 0,
                  "maximum": 1000000000,
                  "default": 1000
                },
                "annualRate": {
                  "type": "number",
                  "title": "Standard annual rate (%)",
                  "description": "Standard annual rate (%)",
                  "minimum": 0,
                  "maximum": 200,
                  "default": 18
                },
                "promoRate": {
                  "type": "number",
                  "title": "Promotional annual rate (%)",
                  "description": "Promotional annual rate (%)",
                  "minimum": 0,
                  "maximum": 200,
                  "default": 0
                },
                "promoEndMonth": {
                  "type": "string",
                  "title": "Promotional expiry month (empty for none)",
                  "description": "Promotional expiry month (empty for none)",
                  "maxLength": 64,
                  "pattern": "^(?:[0-9]{4}-(?:0[1-9]|1[0-2]))?$",
                  "default": ""
                },
                "minimumType": {
                  "type": "string",
                  "title": "Minimum formula",
                  "description": "Minimum formula",
                  "enum": [
                    "fixed",
                    "percent",
                    "interest-plus-percent"
                  ],
                  "default": "fixed"
                },
                "minimumPayment": {
                  "type": "number",
                  "title": "Fixed payment or minimum floor",
                  "description": "Fixed payment or minimum floor",
                  "minimum": 0,
                  "maximum": 1000000000,
                  "default": 25
                },
                "minimumPercent": {
                  "type": "number",
                  "title": "Balance percentage for minimum (%)",
                  "description": "Balance percentage for minimum (%)",
                  "minimum": 0,
                  "maximum": 100,
                  "default": 2
                },
                "transferFeePercent": {
                  "type": "number",
                  "title": "Upfront financed balance-transfer fee (%)",
                  "description": "Upfront financed balance-transfer fee (%)",
                  "minimum": 0,
                  "maximum": 100,
                  "default": 0
                }
              },
              "required": [
                "balance",
                "annualRate",
                "promoRate",
                "promoEndMonth",
                "minimumType",
                "minimumPayment",
                "minimumPercent",
                "transferFeePercent"
              ]
            }
          },
          "strategy": {
            "type": "string",
            "title": "Payoff strategy",
            "description": "Payoff strategy",
            "enum": [
              "avalanche",
              "snowball",
              "consolidation"
            ],
            "default": "avalanche"
          },
          "startMonth": {
            "type": "string",
            "title": "Projection start month",
            "description": "Projection start month",
            "maxLength": 64,
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
            "default": "2026-09"
          },
          "monthlyBudget": {
            "type": "number",
            "title": "Total monthly debt-payment budget",
            "description": "Total monthly debt-payment budget",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 400
          },
          "availableCash": {
            "type": "number",
            "title": "Cash available before protecting reserve",
            "description": "Cash available before protecting reserve",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 0
          },
          "emergencyCashFloor": {
            "type": "number",
            "title": "Protected emergency cash",
            "description": "Protected emergency cash",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 0
          },
          "maxMonths": {
            "type": "integer",
            "title": "Maximum projection months",
            "description": "Maximum projection months",
            "minimum": 1,
            "maximum": 600,
            "default": 600
          },
          "consolidationRate": {
            "type": "number",
            "title": "Consolidation annual rate (%)",
            "description": "Consolidation annual rate (%)",
            "minimum": 0,
            "maximum": 100,
            "default": 8
          },
          "consolidationMonths": {
            "type": "integer",
            "title": "Consolidation contractual months",
            "description": "Consolidation contractual months",
            "minimum": 1,
            "maximum": 600,
            "default": 36
          },
          "consolidationFeePercent": {
            "type": "number",
            "title": "Additional financed consolidation fee (%)",
            "description": "Additional financed consolidation fee (%)",
            "minimum": 0,
            "maximum": 100,
            "default": 0
          }
        },
        "required": [
          "currency",
          "debts",
          "strategy",
          "startMonth",
          "monthlyBudget",
          "availableCash",
          "emergencyCashFloor",
          "maxMonths",
          "consolidationRate",
          "consolidationMonths",
          "consolidationFeePercent"
        ]
      },
      "deposit-calculator": {
        "title": "Deposit and savings interest calculator",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "currency": {
            "type": "string",
            "title": "Currency",
            "description": "Currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "CNY",
              "INR",
              "MXN",
              "BRL",
              "SGD",
              "HKD",
              "SEK",
              "NOK",
              "DKK",
              "NZD",
              "ZAR",
              "KRW",
              "TRY",
              "PLN",
              "CZK",
              "HUF",
              "AED",
              "THB",
              "IDR",
              "MYR",
              "PHP"
            ],
            "default": "USD"
          },
          "principal": {
            "type": "number",
            "title": "Deposit principal",
            "description": "Deposit principal",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 10000
          },
          "annualRate": {
            "type": "number",
            "title": "Nominal annual interest rate (%)",
            "description": "Nominal annual interest rate (%)",
            "minimum": 0,
            "maximum": 100,
            "default": 4
          },
          "compoundsPerYear": {
            "type": "integer",
            "title": "Compounding periods per year",
            "description": "1 annual, 2 semiannual, 4 quarterly, 12 monthly, 365 daily.",
            "enum": [
              1,
              2,
              4,
              12,
              365
            ],
            "default": 12
          },
          "months": {
            "type": "integer",
            "title": "First deposit maturity months",
            "description": "First deposit maturity months",
            "minimum": 1,
            "maximum": 600,
            "default": 12
          },
          "taxPercent": {
            "type": "number",
            "title": "Tax rate on net positive interest (%)",
            "description": "Tax rate on net positive interest (%)",
            "minimum": 0,
            "maximum": 100,
            "default": 0
          },
          "withdrawAfterMonths": {
            "type": "integer",
            "title": "Withdrawal month (0 means each maturity)",
            "description": "Withdrawal month (0 means each maturity)",
            "minimum": 0,
            "maximum": 600,
            "default": 0
          },
          "penaltyInterestMonths": {
            "type": "integer",
            "title": "Early penalty in months of simple interest",
            "description": "Early penalty in months of simple interest",
            "minimum": 0,
            "maximum": 120,
            "default": 0
          },
          "mode": {
            "type": "string",
            "title": "Deposit structure",
            "description": "Deposit structure",
            "enum": [
              "single",
              "ladder"
            ],
            "default": "single"
          },
          "ladderRungs": {
            "type": "integer",
            "title": "Ladder rungs",
            "description": "Ladder rungs",
            "minimum": 1,
            "maximum": 12,
            "default": 3
          },
          "ladderSpacingMonths": {
            "type": "integer",
            "title": "Months between ladder maturities",
            "description": "Months between ladder maturities",
            "minimum": 1,
            "maximum": 60,
            "default": 12
          },
          "ladderRateStep": {
            "type": "number",
            "title": "Annual rate increase per rung (percentage points)",
            "description": "Annual rate increase per rung (percentage points)",
            "minimum": -20,
            "maximum": 20,
            "default": 0
          }
        },
        "required": [
          "currency",
          "principal",
          "annualRate",
          "compoundsPerYear",
          "months",
          "taxPercent",
          "withdrawAfterMonths",
          "penaltyInterestMonths",
          "mode",
          "ladderRungs",
          "ladderSpacingMonths",
          "ladderRateStep"
        ]
      },
      "dividend-calculator": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "currency": {
            "type": "string",
            "title": "Currency",
            "description": "Currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "CNY",
              "INR",
              "MXN",
              "BRL",
              "SGD",
              "HKD",
              "SEK",
              "NOK",
              "DKK",
              "NZD",
              "ZAR",
              "KRW",
              "TRY",
              "PLN",
              "CZK",
              "HUF",
              "AED",
              "THB",
              "IDR",
              "MYR",
              "PHP"
            ],
            "default": "USD"
          },
          "mode": {
            "type": "string",
            "title": "Dividend mode",
            "description": "Dividend mode",
            "enum": [
              "projection",
              "income-target"
            ],
            "default": "projection"
          },
          "principal": {
            "type": "number",
            "title": "Starting investment",
            "description": "Starting investment",
            "default": 10000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "months": {
            "type": "integer",
            "title": "Projection months",
            "description": "Projection months",
            "default": 12,
            "minimum": 1,
            "maximum": 600
          },
          "monthlyContribution": {
            "type": "number",
            "title": "Monthly investment",
            "description": "Monthly investment",
            "default": 0,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "monthlyIncomeTarget": {
            "type": "number",
            "title": "Monthly income target",
            "description": "Monthly income target",
            "default": 1000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "dividendYield": {
            "type": "number",
            "title": "Initial annual dividend yield (%)",
            "description": "Initial annual dividend yield (%)",
            "default": 4,
            "minimum": 0,
            "maximum": 100
          },
          "dividendGrowth": {
            "type": "number",
            "title": "Annual dividend-per-share growth (%)",
            "description": "Annual dividend-per-share growth (%)",
            "default": 0,
            "minimum": -99,
            "maximum": 100
          },
          "priceGrowth": {
            "type": "number",
            "title": "Annual share-price growth (%)",
            "description": "Annual share-price growth (%)",
            "default": 0,
            "minimum": -99,
            "maximum": 100
          },
          "taxRate": {
            "type": "number",
            "title": "Dividend tax (%)",
            "description": "Dividend tax (%)",
            "default": 0,
            "minimum": 0,
            "maximum": 100
          },
          "reinvest": {
            "type": "boolean",
            "title": "Reinvest dividends",
            "description": "Buy additional shares with after-tax dividends at each month end.",
            "default": true
          }
        },
        "required": [
          "currency",
          "mode",
          "principal",
          "months",
          "monthlyContribution",
          "monthlyIncomeTarget",
          "dividendYield",
          "dividendGrowth",
          "priceGrowth",
          "taxRate",
          "reinvest"
        ]
      },
      "fire-calculator": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "currency": {
            "type": "string",
            "title": "Currency",
            "description": "Currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "CNY",
              "INR",
              "MXN",
              "BRL",
              "SGD",
              "HKD",
              "SEK",
              "NOK",
              "DKK",
              "NZD",
              "ZAR",
              "KRW",
              "TRY",
              "PLN",
              "CZK",
              "HUF",
              "AED",
              "THB",
              "IDR",
              "MYR",
              "PHP"
            ],
            "default": "USD"
          },
          "mode": {
            "type": "string",
            "title": "FIRE mode",
            "description": "FIRE mode",
            "enum": [
              "standard",
              "lean",
              "fat",
              "barista",
              "coast",
              "expat"
            ],
            "default": "standard"
          },
          "principal": {
            "type": "number",
            "title": "Current invested balance",
            "description": "Current invested balance",
            "default": 100000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "monthlyExpenses": {
            "type": "number",
            "title": "Target monthly spending",
            "description": "Target monthly spending",
            "default": 2000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "withdrawalRate": {
            "type": "number",
            "title": "Annual withdrawal rate (%)",
            "description": "Annual withdrawal rate (%)",
            "default": 4,
            "minimum": 0.1,
            "maximum": 100
          },
          "annualReturn": {
            "type": "number",
            "title": "Annual return (%)",
            "description": "Annual return (%)",
            "default": 0,
            "minimum": -99,
            "maximum": 100
          },
          "inflationRate": {
            "type": "number",
            "title": "Annual inflation (%)",
            "description": "Annual inflation (%)",
            "default": 0,
            "minimum": -99,
            "maximum": 100
          },
          "savingMode": {
            "type": "string",
            "title": "Saving input",
            "description": "Saving input",
            "enum": [
              "amount",
              "rate"
            ],
            "default": "amount"
          },
          "monthlyContribution": {
            "type": "number",
            "title": "Monthly invested saving",
            "description": "Monthly invested saving",
            "default": 1000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "monthlyIncome": {
            "type": "number",
            "title": "Monthly take-home income",
            "description": "Monthly take-home income",
            "default": 5000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "savingsRate": {
            "type": "number",
            "title": "Saving rate (%)",
            "description": "Saving rate (%)",
            "default": 20,
            "minimum": 0,
            "maximum": 100
          },
          "monthlyBaristaIncome": {
            "type": "number",
            "title": "Monthly part-time income",
            "description": "Monthly part-time income",
            "default": 0,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "monthlyPension": {
            "type": "number",
            "title": "Monthly expected pension",
            "description": "Monthly expected pension",
            "default": 0,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "retirementMonths": {
            "type": "integer",
            "title": "Months until retirement",
            "description": "Months until retirement",
            "default": 240,
            "minimum": 1,
            "maximum": 600
          },
          "startMonth": {
            "type": "string",
            "title": "Starting month",
            "description": "Starting month for the projected milestone date, in YYYY-MM format.",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])$",
            "default": "2026-09"
          }
        },
        "required": [
          "currency",
          "mode",
          "principal",
          "monthlyExpenses",
          "withdrawalRate",
          "annualReturn",
          "inflationRate",
          "savingMode",
          "monthlyContribution",
          "monthlyIncome",
          "savingsRate",
          "monthlyBaristaIncome",
          "monthlyPension",
          "retirementMonths",
          "startMonth"
        ]
      },
      "inflation-calculator": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "amount": {
            "type": "number",
            "title": "Amount",
            "description": "Amount",
            "default": 1000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "country": {
            "type": "string",
            "title": "Country",
            "description": "World Bank ISO alpha-3 country code. Available observation years vary by country.",
            "enum": [
              "ABW",
              "AFG",
              "AGO",
              "ALB",
              "ARE",
              "ARM",
              "ATG",
              "AUS",
              "AUT",
              "AZE",
              "BDI",
              "BEL",
              "BEN",
              "BFA",
              "BGD",
              "BGR",
              "BHR",
              "BHS",
              "BIH",
              "BLR",
              "BLZ",
              "BOL",
              "BRA",
              "BRB",
              "BRN",
              "BTN",
              "BWA",
              "CAF",
              "CAN",
              "CHE",
              "CHL",
              "CHN",
              "CIV",
              "CMR",
              "COD",
              "COG",
              "COL",
              "COM",
              "CPV",
              "CRI",
              "CUW",
              "CYM",
              "CYP",
              "CZE",
              "DEU",
              "DJI",
              "DMA",
              "DNK",
              "DOM",
              "DZA",
              "ECU",
              "EGY",
              "ESP",
              "EST",
              "ETH",
              "FIN",
              "FJI",
              "FRA",
              "FSM",
              "GAB",
              "GBR",
              "GEO",
              "GHA",
              "GIN",
              "GMB",
              "GNB",
              "GNQ",
              "GRC",
              "GRD",
              "GTM",
              "GUY",
              "HKG",
              "HND",
              "HRV",
              "HTI",
              "HUN",
              "IDN",
              "IND",
              "IRL",
              "IRN",
              "IRQ",
              "ISL",
              "ISR",
              "ITA",
              "JAM",
              "JOR",
              "JPN",
              "KAZ",
              "KEN",
              "KGZ",
              "KHM",
              "KIR",
              "KNA",
              "KOR",
              "KWT",
              "LAO",
              "LBN",
              "LBR",
              "LBY",
              "LCA",
              "LKA",
              "LSO",
              "LTU",
              "LUX",
              "LVA",
              "MAC",
              "MAR",
              "MDA",
              "MDG",
              "MDV",
              "MEX",
              "MKD",
              "MLI",
              "MLT",
              "MMR",
              "MNE",
              "MNG",
              "MOZ",
              "MRT",
              "MUS",
              "MWI",
              "MYS",
              "NAM",
              "NCL",
              "NER",
              "NGA",
              "NIC",
              "NLD",
              "NOR",
              "NPL",
              "NRU",
              "NZL",
              "OMN",
              "PAK",
              "PAN",
              "PER",
              "PHL",
              "PLW",
              "PNG",
              "POL",
              "PRT",
              "PRY",
              "PSE",
              "QAT",
              "ROU",
              "RUS",
              "RWA",
              "SAU",
              "SDN",
              "SEN",
              "SGP",
              "SLB",
              "SLE",
              "SLV",
              "SMR",
              "SRB",
              "SSD",
              "STP",
              "SUR",
              "SVK",
              "SVN",
              "SWE",
              "SWZ",
              "SXM",
              "SYC",
              "SYR",
              "TCD",
              "TGO",
              "THA",
              "TJK",
              "TLS",
              "TON",
              "TTO",
              "TUN",
              "TUR",
              "TUV",
              "TZA",
              "UGA",
              "UKR",
              "URY",
              "USA",
              "UZB",
              "VCT",
              "VEN",
              "VNM",
              "VUT",
              "WSM",
              "XKX",
              "YEM",
              "ZAF",
              "ZMB",
              "ZWE"
            ],
            "default": "USA"
          },
          "startYear": {
            "type": "integer",
            "title": "From year",
            "description": "From year",
            "default": 2000,
            "minimum": 1960,
            "maximum": 2025
          },
          "endYear": {
            "type": "integer",
            "title": "To year",
            "description": "To year",
            "default": 2024,
            "minimum": 1960,
            "maximum": 2025
          }
        },
        "required": [
          "amount",
          "country",
          "startYear",
          "endYear"
        ]
      },
      "investment-growth-calculator": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "currency": {
            "type": "string",
            "title": "Currency",
            "description": "Currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "CNY",
              "INR",
              "MXN",
              "BRL",
              "SGD",
              "HKD",
              "SEK",
              "NOK",
              "DKK",
              "NZD",
              "ZAR",
              "KRW",
              "TRY",
              "PLN",
              "CZK",
              "HUF",
              "AED",
              "THB",
              "IDR",
              "MYR",
              "PHP"
            ],
            "default": "USD"
          },
          "principal": {
            "type": "number",
            "title": "Starting balance",
            "description": "Starting balance",
            "default": 10000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "months": {
            "type": "integer",
            "title": "Projection months",
            "description": "Projection months",
            "default": 12,
            "minimum": 1,
            "maximum": 600
          },
          "monthlyContribution": {
            "type": "number",
            "title": "Monthly contribution",
            "description": "Monthly contribution",
            "default": 0,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "annualReturn": {
            "type": "number",
            "title": "Annual return (%)",
            "description": "Annual return (%)",
            "default": 0,
            "minimum": -99,
            "maximum": 100
          },
          "mode": {
            "type": "string",
            "title": "Displayed result",
            "description": "Displayed result",
            "enum": [
              "gross",
              "after-fee",
              "after-tax",
              "real"
            ],
            "default": "after-tax"
          },
          "monthlyWithdrawal": {
            "type": "number",
            "title": "Monthly withdrawal",
            "description": "Monthly withdrawal",
            "default": 0,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "annualVolatility": {
            "type": "number",
            "title": "Annual volatility (%)",
            "description": "Annual volatility (%)",
            "default": 0,
            "minimum": 0,
            "maximum": 200
          },
          "annualFee": {
            "type": "number",
            "title": "Annual asset fee (%)",
            "description": "Annual asset fee (%)",
            "default": 0,
            "minimum": 0,
            "maximum": 100
          },
          "taxRate": {
            "type": "number",
            "title": "Tax on positive gains (%)",
            "description": "Tax on positive gains (%)",
            "default": 0,
            "minimum": 0,
            "maximum": 100
          },
          "inflationRate": {
            "type": "number",
            "title": "Annual inflation (%)",
            "description": "Annual inflation (%)",
            "default": 0,
            "minimum": -99,
            "maximum": 100
          },
          "contributionGrowth": {
            "type": "number",
            "title": "Annual contribution growth (%)",
            "description": "Annual contribution growth (%)",
            "default": 0,
            "minimum": -99,
            "maximum": 100
          },
          "paths": {
            "type": "integer",
            "title": "Simulation paths",
            "description": "Simulation paths",
            "default": 1000,
            "minimum": 1,
            "maximum": 1000
          },
          "seed": {
            "type": "string",
            "title": "Simulation seed",
            "description": "Leave empty to derive a reproducible seed from your inputs, or enter 16 hexadecimal characters.",
            "default": "",
            "pattern": "^(?:[a-fA-F0-9]{16})?$"
          }
        },
        "required": [
          "currency",
          "principal",
          "months",
          "monthlyContribution",
          "annualReturn",
          "mode",
          "monthlyWithdrawal",
          "annualVolatility",
          "annualFee",
          "taxRate",
          "inflationRate",
          "contributionGrowth",
          "paths",
          "seed"
        ]
      },
      "loan-calculator": {
        "title": "Loan and EMI calculator",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "currency": {
            "type": "string",
            "title": "Currency",
            "description": "Currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "CNY",
              "INR",
              "MXN",
              "BRL",
              "SGD",
              "HKD",
              "SEK",
              "NOK",
              "DKK",
              "NZD",
              "ZAR",
              "KRW",
              "TRY",
              "PLN",
              "CZK",
              "HUF",
              "AED",
              "THB",
              "IDR",
              "MYR",
              "PHP"
            ],
            "default": "USD"
          },
          "principal": {
            "type": "number",
            "title": "Loan principal",
            "description": "Loan principal",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 20000
          },
          "annualRate": {
            "type": "number",
            "title": "Annual interest rate (%)",
            "description": "Annual interest rate (%)",
            "minimum": 0,
            "maximum": 100,
            "default": 6
          },
          "months": {
            "type": "integer",
            "title": "Duration in months",
            "description": "Duration in months",
            "minimum": 1,
            "maximum": 600,
            "default": 60
          },
          "rateType": {
            "type": "string",
            "title": "Interest calculation",
            "description": "Interest calculation",
            "enum": [
              "reducing",
              "flat"
            ],
            "default": "reducing"
          },
          "extraMonthly": {
            "type": "number",
            "title": "Extra monthly payment",
            "description": "Extra monthly payment",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 0
          },
          "lumpSum": {
            "type": "number",
            "title": "One-time extra payment",
            "description": "One-time extra payment",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 0
          },
          "lumpSumMonth": {
            "type": "integer",
            "title": "Month of one-time payment",
            "description": "Month of one-time payment",
            "minimum": 1,
            "maximum": 600,
            "default": 1
          },
          "originationFee": {
            "type": "number",
            "title": "Upfront origination fee",
            "description": "Upfront origination fee",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 0
          }
        },
        "required": [
          "currency",
          "principal",
          "annualRate",
          "months",
          "rateType",
          "extraMonthly",
          "lumpSum",
          "lumpSumMonth",
          "originationFee"
        ]
      },
      "mortgage-calculator": {
        "title": "Mortgage affordability and stress calculator",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "currency": {
            "type": "string",
            "title": "Currency",
            "description": "Currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "CNY",
              "INR",
              "MXN",
              "BRL",
              "SGD",
              "HKD",
              "SEK",
              "NOK",
              "DKK",
              "NZD",
              "ZAR",
              "KRW",
              "TRY",
              "PLN",
              "CZK",
              "HUF",
              "AED",
              "THB",
              "IDR",
              "MYR",
              "PHP"
            ],
            "default": "USD"
          },
          "homePrice": {
            "type": "number",
            "title": "Home price",
            "description": "Home price",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 400000
          },
          "downPayment": {
            "type": "number",
            "title": "Deposit",
            "description": "Deposit",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 80000
          },
          "annualRate": {
            "type": "number",
            "title": "Annual interest rate (%)",
            "description": "Annual interest rate (%)",
            "minimum": 0,
            "maximum": 100,
            "default": 5
          },
          "months": {
            "type": "integer",
            "title": "Duration in months",
            "description": "Duration in months",
            "minimum": 1,
            "maximum": 600,
            "default": 300
          },
          "afterTaxMonthlyIncome": {
            "type": "number",
            "title": "After-tax monthly household income",
            "description": "After-tax monthly household income",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 7000
          },
          "monthlyLivingCosts": {
            "type": "number",
            "title": "Monthly non-housing living costs",
            "description": "Monthly non-housing living costs",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 2500
          },
          "monthlySavings": {
            "type": "number",
            "title": "Protected monthly saving",
            "description": "Protected monthly saving",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 500
          },
          "annualPropertyTax": {
            "type": "number",
            "title": "Annual property tax entered",
            "description": "Annual property tax entered",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 2400
          },
          "annualInsurance": {
            "type": "number",
            "title": "Annual home insurance",
            "description": "Annual home insurance",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 1200
          },
          "maintenancePercent": {
            "type": "number",
            "title": "Annual maintenance (% of price)",
            "description": "Annual maintenance (% of price)",
            "minimum": 0,
            "maximum": 20,
            "default": 1
          },
          "monthlyServiceCharges": {
            "type": "number",
            "title": "Monthly service charges",
            "description": "Monthly service charges",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 150
          },
          "cashSavings": {
            "type": "number",
            "title": "Cash before the purchase",
            "description": "Cash before the purchase",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 120000
          },
          "closingCosts": {
            "type": "number",
            "title": "Upfront closing costs",
            "description": "Upfront closing costs",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 10000
          },
          "reserveMonths": {
            "type": "integer",
            "title": "Required reserve months",
            "description": "Required reserve months",
            "minimum": 0,
            "maximum": 60,
            "default": 6
          },
          "jobLossMonths": {
            "type": "integer",
            "title": "Months with no household income",
            "description": "Months with no household income",
            "minimum": 0,
            "maximum": 60,
            "default": 3
          },
          "maxLoanToValuePercent": {
            "type": "number",
            "title": "Maximum loan-to-value (%)",
            "description": "Maximum loan-to-value (%)",
            "minimum": 1,
            "maximum": 100,
            "default": 80
          },
          "stressRateIncrease": {
            "type": "number",
            "title": "Stress interest-rate increase (percentage points)",
            "description": "Stress interest-rate increase (percentage points)",
            "minimum": 0,
            "maximum": 30,
            "default": 2
          }
        },
        "required": [
          "currency",
          "homePrice",
          "downPayment",
          "annualRate",
          "months",
          "afterTaxMonthlyIncome",
          "monthlyLivingCosts",
          "monthlySavings",
          "annualPropertyTax",
          "annualInsurance",
          "maintenancePercent",
          "monthlyServiceCharges",
          "cashSavings",
          "closingCosts",
          "reserveMonths",
          "jobLossMonths",
          "maxLoanToValuePercent",
          "stressRateIncrease"
        ]
      },
      "net-worth-calculator": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "currency": {
            "type": "string",
            "title": "Currency",
            "description": "All entered amounts use this currency. No automatic currency conversion.",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "CNY",
              "INR",
              "MXN",
              "BRL",
              "SGD",
              "HKD",
              "SEK",
              "NOK",
              "DKK",
              "NZD",
              "ZAR",
              "KRW",
              "TRY",
              "PLN",
              "CZK",
              "HUF",
              "AED",
              "THB",
              "IDR",
              "MYR",
              "PHP"
            ],
            "default": "USD"
          },
          "assets": {
            "type": "array",
            "title": "Assets",
            "description": "Values of the assets you own, all in the selected currency. For the US survey comparison use household values in 2022 US dollars.",
            "default": [
              {
                "name": "Cash and investments",
                "amount": 100000
              },
              {
                "name": "Property",
                "amount": 200000
              }
            ],
            "minItems": 0,
            "maxItems": 30,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "name",
                "amount"
              ],
              "properties": {
                "name": {
                  "type": "string",
                  "title": "Asset name",
                  "description": "Asset name",
                  "default": "Asset",
                  "maxLength": 100
                },
                "amount": {
                  "type": "number",
                  "title": "Asset value",
                  "description": "Asset value",
                  "default": 0,
                  "minimum": 0,
                  "maximum": 1000000000000
                }
              }
            }
          },
          "liabilities": {
            "type": "array",
            "title": "Liabilities",
            "description": "Outstanding balances, all in the selected currency.",
            "default": [
              {
                "name": "Mortgage and loans",
                "amount": 100000
              }
            ],
            "minItems": 0,
            "maxItems": 30,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "name",
                "amount"
              ],
              "properties": {
                "name": {
                  "type": "string",
                  "title": "Liability name",
                  "description": "Liability name",
                  "default": "Liability",
                  "maxLength": 100
                },
                "amount": {
                  "type": "number",
                  "title": "Outstanding balance",
                  "description": "Outstanding balance",
                  "default": 0,
                  "minimum": 0,
                  "maximum": 1000000000000
                }
              }
            }
          },
          "compareUS": {
            "type": "boolean",
            "title": "Compare with US households",
            "description": "Only for USD household values expressed in 2022 dollars, using SCF 2022. It is not a current worldwide ranking.",
            "default": false
          },
          "ageGroup": {
            "type": "string",
            "title": "Age of household reference person",
            "description": "Groups use the age of the SCF household reference person, not each household member.",
            "enum": [
              "35-44",
              "45-54",
              "55-64",
              "65-74",
              "75-plus",
              "all",
              "under-35"
            ],
            "default": "all"
          }
        },
        "required": [
          "currency",
          "assets",
          "liabilities",
          "compareUS",
          "ageGroup"
        ]
      },
      "overpay-or-invest": {
        "title": "Overpay the mortgage or invest calculator",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "currency": {
            "type": "string",
            "title": "Currency",
            "description": "Currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "CNY",
              "INR",
              "MXN",
              "BRL",
              "SGD",
              "HKD",
              "SEK",
              "NOK",
              "DKK",
              "NZD",
              "ZAR",
              "KRW",
              "TRY",
              "PLN",
              "CZK",
              "HUF",
              "AED",
              "THB",
              "IDR",
              "MYR",
              "PHP"
            ],
            "default": "USD"
          },
          "principal": {
            "type": "number",
            "title": "Mortgage balance",
            "description": "Mortgage balance",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 300000
          },
          "homeValue": {
            "type": "number",
            "title": "Home value for insurance removal",
            "description": "Home value for insurance removal",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 400000
          },
          "mortgageRate": {
            "type": "number",
            "title": "Mortgage annual rate (%)",
            "description": "Mortgage annual rate (%)",
            "minimum": 0,
            "maximum": 100,
            "default": 5
          },
          "mortgageMonths": {
            "type": "integer",
            "title": "Mortgage remaining months",
            "description": "Mortgage remaining months",
            "minimum": 1,
            "maximum": 600,
            "default": 300
          },
          "extraMonthly": {
            "type": "number",
            "title": "Extra cash each month",
            "description": "Extra cash each month",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 500
          },
          "horizonMonths": {
            "type": "integer",
            "title": "Common comparison horizon months",
            "description": "Common comparison horizon months",
            "minimum": 1,
            "maximum": 600,
            "default": 300
          },
          "investmentReturn": {
            "type": "number",
            "title": "Expected effective annual investment return (%)",
            "description": "Expected effective annual investment return (%)",
            "minimum": -50,
            "maximum": 50,
            "default": 6
          },
          "volatility": {
            "type": "number",
            "title": "Annual investment volatility (%)",
            "description": "Annual investment volatility (%)",
            "minimum": 0,
            "maximum": 100,
            "default": 15
          },
          "paths": {
            "type": "integer",
            "title": "Simulation paths",
            "description": "Simulation paths",
            "minimum": 1,
            "maximum": 1000,
            "default": 250
          },
          "seed": {
            "type": "string",
            "title": "Seed (empty or 16 hexadecimal characters)",
            "description": "Seed (empty or 16 hexadecimal characters)",
            "maxLength": 64,
            "pattern": "^(?:[a-fA-F0-9]{16})?$",
            "default": ""
          },
          "initialInvestment": {
            "type": "number",
            "title": "Initial investment cash outside reserve",
            "description": "Initial investment cash outside reserve",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 20000
          },
          "protectedCash": {
            "type": "number",
            "title": "Protected cash outside investment portfolio",
            "description": "Protected cash outside investment portfolio",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 10000
          },
          "overpaymentClosingCost": {
            "type": "number",
            "title": "Upfront cost charged to overpayment option",
            "description": "Upfront cost charged to overpayment option",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 0
          },
          "monthlyMortgageInsurance": {
            "type": "number",
            "title": "Monthly mortgage insurance",
            "description": "Monthly mortgage insurance",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 0
          },
          "insuranceRemovalLTV": {
            "type": "number",
            "title": "Insurance removal loan-to-value (%)",
            "description": "Insurance removal loan-to-value (%)",
            "minimum": 0,
            "maximum": 100,
            "default": 78
          }
        },
        "required": [
          "currency",
          "principal",
          "homeValue",
          "mortgageRate",
          "mortgageMonths",
          "extraMonthly",
          "horizonMonths",
          "investmentReturn",
          "volatility",
          "paths",
          "seed",
          "initialInvestment",
          "protectedCash",
          "overpaymentClosingCost",
          "monthlyMortgageInsurance",
          "insuranceRemovalLTV"
        ]
      },
      "rent-vs-buy-calculator": {
        "title": "Rent versus buy calculator",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "currency": {
            "type": "string",
            "title": "Currency",
            "description": "Currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "CNY",
              "INR",
              "MXN",
              "BRL",
              "SGD",
              "HKD",
              "SEK",
              "NOK",
              "DKK",
              "NZD",
              "ZAR",
              "KRW",
              "TRY",
              "PLN",
              "CZK",
              "HUF",
              "AED",
              "THB",
              "IDR",
              "MYR",
              "PHP"
            ],
            "default": "USD"
          },
          "homePrice": {
            "type": "number",
            "title": "Home purchase price",
            "description": "Home purchase price",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 400000
          },
          "downPayment": {
            "type": "number",
            "title": "Cash deposit",
            "description": "Cash deposit",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 80000
          },
          "annualMortgageRate": {
            "type": "number",
            "title": "Mortgage annual rate (%)",
            "description": "Mortgage annual rate (%)",
            "minimum": 0,
            "maximum": 100,
            "default": 5
          },
          "mortgageMonths": {
            "type": "integer",
            "title": "Mortgage term months",
            "description": "Mortgage term months",
            "minimum": 1,
            "maximum": 600,
            "default": 300
          },
          "horizonMonths": {
            "type": "integer",
            "title": "Comparison horizon months",
            "description": "Comparison horizon months",
            "minimum": 1,
            "maximum": 600,
            "default": 120
          },
          "buyingCostsPercent": {
            "type": "number",
            "title": "Purchase transaction costs (%)",
            "description": "Purchase transaction costs (%)",
            "minimum": 0,
            "maximum": 30,
            "default": 3
          },
          "sellingCostsPercent": {
            "type": "number",
            "title": "Selling transaction costs (%)",
            "description": "Selling transaction costs (%)",
            "minimum": 0,
            "maximum": 30,
            "default": 3
          },
          "homeAppreciation": {
            "type": "number",
            "title": "Effective annual home appreciation (%)",
            "description": "Effective annual home appreciation (%)",
            "minimum": -50,
            "maximum": 100,
            "default": 0
          },
          "monthlyRent": {
            "type": "number",
            "title": "Starting monthly rent",
            "description": "Starting monthly rent",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 1800
          },
          "rentGrowth": {
            "type": "number",
            "title": "Effective annual rent growth (%)",
            "description": "Effective annual rent growth (%)",
            "minimum": -50,
            "maximum": 100,
            "default": 0
          },
          "investmentReturn": {
            "type": "number",
            "title": "Effective annual investment return (%)",
            "description": "Effective annual investment return (%)",
            "minimum": -50,
            "maximum": 100,
            "default": 0
          },
          "annualPropertyTaxPercent": {
            "type": "number",
            "title": "Annual property tax (% of current value)",
            "description": "Annual property tax (% of current value)",
            "minimum": 0,
            "maximum": 20,
            "default": 0
          },
          "annualMaintenancePercent": {
            "type": "number",
            "title": "Annual maintenance (% of current value)",
            "description": "Annual maintenance (% of current value)",
            "minimum": 0,
            "maximum": 20,
            "default": 1
          },
          "annualHomeInsurance": {
            "type": "number",
            "title": "Starting annual home insurance",
            "description": "Starting annual home insurance",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 1200
          },
          "monthlyServiceCharges": {
            "type": "number",
            "title": "Starting monthly service charges",
            "description": "Starting monthly service charges",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 150
          },
          "annualRentersInsurance": {
            "type": "number",
            "title": "Starting annual renter insurance",
            "description": "Starting annual renter insurance",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 200
          },
          "costInflation": {
            "type": "number",
            "title": "Effective annual insurance and service inflation (%)",
            "description": "Effective annual insurance and service inflation (%)",
            "minimum": -50,
            "maximum": 100,
            "default": 0
          }
        },
        "required": [
          "currency",
          "homePrice",
          "downPayment",
          "annualMortgageRate",
          "mortgageMonths",
          "horizonMonths",
          "buyingCostsPercent",
          "sellingCostsPercent",
          "homeAppreciation",
          "monthlyRent",
          "rentGrowth",
          "investmentReturn",
          "annualPropertyTaxPercent",
          "annualMaintenancePercent",
          "annualHomeInsurance",
          "monthlyServiceCharges",
          "annualRentersInsurance",
          "costInflation"
        ]
      },
      "retirement-calculator": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "currency": {
            "type": "string",
            "title": "Currency",
            "description": "Currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "CNY",
              "INR",
              "MXN",
              "BRL",
              "SGD",
              "HKD",
              "SEK",
              "NOK",
              "DKK",
              "NZD",
              "ZAR",
              "KRW",
              "TRY",
              "PLN",
              "CZK",
              "HUF",
              "AED",
              "THB",
              "IDR",
              "MYR",
              "PHP"
            ],
            "default": "USD"
          },
          "principal": {
            "type": "number",
            "title": "Starting balance",
            "description": "Starting balance",
            "default": 10000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "months": {
            "type": "integer",
            "title": "Projection months",
            "description": "Projection months",
            "default": 12,
            "minimum": 1,
            "maximum": 600
          },
          "monthlyContribution": {
            "type": "number",
            "title": "Monthly contribution",
            "description": "Monthly contribution",
            "default": 0,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "annualReturn": {
            "type": "number",
            "title": "Annual return (%)",
            "description": "Annual return (%)",
            "default": 0,
            "minimum": -99,
            "maximum": 100
          },
          "retirementMonth": {
            "type": "integer",
            "title": "First retirement month",
            "description": "First retirement month",
            "default": 1,
            "minimum": 1,
            "maximum": 601
          },
          "monthlyExpenses": {
            "type": "number",
            "title": "Monthly retirement spending",
            "description": "Monthly retirement spending",
            "default": 1000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "pensionStartMonth": {
            "type": "integer",
            "title": "First pension month",
            "description": "First pension month",
            "default": 1,
            "minimum": 1,
            "maximum": 601
          },
          "monthlyPension": {
            "type": "number",
            "title": "Monthly pension in today's money",
            "description": "Monthly pension in today's money",
            "default": 0,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "annualVolatility": {
            "type": "number",
            "title": "Annual volatility (%)",
            "description": "Annual volatility (%)",
            "default": 0,
            "minimum": 0,
            "maximum": 200
          },
          "annualFee": {
            "type": "number",
            "title": "Annual asset fee (%)",
            "description": "Annual asset fee (%)",
            "default": 0,
            "minimum": 0,
            "maximum": 100
          },
          "taxRate": {
            "type": "number",
            "title": "Tax on positive gains (%)",
            "description": "Tax on positive gains (%)",
            "default": 0,
            "minimum": 0,
            "maximum": 100
          },
          "inflationRate": {
            "type": "number",
            "title": "Annual inflation (%)",
            "description": "Annual inflation (%)",
            "default": 0,
            "minimum": -99,
            "maximum": 100
          },
          "paths": {
            "type": "integer",
            "title": "Simulation paths",
            "description": "Simulation paths",
            "default": 1000,
            "minimum": 1,
            "maximum": 1000
          },
          "seed": {
            "type": "string",
            "title": "Simulation seed",
            "description": "Leave empty to derive a reproducible seed from your inputs, or enter 16 hexadecimal characters.",
            "default": "",
            "pattern": "^(?:[a-fA-F0-9]{16})?$"
          },
          "lifeStages": {
            "type": "array",
            "title": "Life stages",
            "description": "Optional nonoverlapping inclusive month ranges overriding retirement spending and adding other monthly income. Each amount is expressed in today's money.",
            "default": [],
            "maxItems": 20,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "startMonth": {
                  "type": "integer",
                  "title": "First month",
                  "description": "First month",
                  "default": 1,
                  "minimum": 1,
                  "maximum": 600
                },
                "endMonth": {
                  "type": "integer",
                  "title": "Last month",
                  "description": "Last month",
                  "default": 12,
                  "minimum": 1,
                  "maximum": 600
                },
                "monthlyExpenses": {
                  "type": "number",
                  "title": "Monthly expenses in today's money",
                  "description": "Monthly expenses in today's money",
                  "default": 0,
                  "minimum": 0,
                  "maximum": 1000000000000
                },
                "monthlyIncome": {
                  "type": "number",
                  "title": "Monthly other income in today's money",
                  "description": "Monthly other income in today's money",
                  "default": 0,
                  "minimum": 0,
                  "maximum": 1000000000000
                }
              },
              "required": [
                "startMonth",
                "endMonth",
                "monthlyExpenses",
                "monthlyIncome"
              ]
            }
          }
        },
        "required": [
          "currency",
          "principal",
          "months",
          "monthlyContribution",
          "annualReturn",
          "retirementMonth",
          "monthlyExpenses",
          "pensionStartMonth",
          "monthlyPension",
          "annualVolatility",
          "annualFee",
          "taxRate",
          "inflationRate",
          "paths",
          "seed",
          "lifeStages"
        ]
      },
      "runway-calculator": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "currency": {
            "type": "string",
            "title": "Currency",
            "description": "All entered amounts use this currency. No automatic currency conversion.",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "CNY",
              "INR",
              "MXN",
              "BRL",
              "SGD",
              "HKD",
              "SEK",
              "NOK",
              "DKK",
              "NZD",
              "ZAR",
              "KRW",
              "TRY",
              "PLN",
              "CZK",
              "HUF",
              "AED",
              "THB",
              "IDR",
              "MYR",
              "PHP"
            ],
            "default": "USD"
          },
          "mode": {
            "type": "string",
            "title": "Mode",
            "description": "Mode",
            "enum": [
              "scenarios",
              "job-loss",
              "sabbatical",
              "drawdown"
            ],
            "default": "scenarios"
          },
          "scenario": {
            "type": "string",
            "title": "Scenario",
            "description": "Scenario",
            "enum": [
              "current",
              "trim-spending",
              "raise-income",
              "stress"
            ],
            "default": "current"
          },
          "liquidAssets": {
            "type": "number",
            "title": "Liquid savings",
            "description": "Liquid savings",
            "default": 12000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "monthlyIncome": {
            "type": "number",
            "title": "Recurring monthly income",
            "description": "Recurring monthly income",
            "default": 2000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "monthlyExpenses": {
            "type": "number",
            "title": "Recurring monthly expenses",
            "description": "Recurring monthly expenses",
            "default": 3000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "obligationsDue12Months": {
            "type": "number",
            "title": "Separate obligations due over 12 months",
            "description": "Separate obligations due over 12 months",
            "default": 0,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "leaveMonths": {
            "type": "integer",
            "title": "Sabbatical length in months",
            "description": "Sabbatical length in months",
            "default": 6,
            "minimum": 1,
            "maximum": 120
          },
          "incomeDuringLeave": {
            "type": "number",
            "title": "Monthly income during leave",
            "description": "Monthly income during leave",
            "default": 0,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "horizonMonths": {
            "type": "integer",
            "title": "Simulation horizon in months",
            "description": "Simulation horizon in months",
            "default": 120,
            "minimum": 1,
            "maximum": 600
          },
          "variancePercent": {
            "type": "number",
            "title": "Monthly income and expense variation (%)",
            "description": "Monthly income and expense variation (%)",
            "default": 10,
            "minimum": 0,
            "maximum": 100
          },
          "paths": {
            "type": "integer",
            "title": "Simulation paths",
            "description": "Simulation paths",
            "default": 1000,
            "minimum": 100,
            "maximum": 1000
          },
          "seed": {
            "type": "string",
            "title": "Simulation seed",
            "description": "Simulation seed",
            "default": "",
            "maxLength": 16,
            "pattern": "^(?:[a-fA-F0-9]{16})?$"
          }
        },
        "required": [
          "currency",
          "mode",
          "scenario",
          "liquidAssets",
          "monthlyIncome",
          "monthlyExpenses",
          "obligationsDue12Months",
          "leaveMonths",
          "incomeDuringLeave",
          "horizonMonths",
          "variancePercent",
          "paths",
          "seed"
        ]
      },
      "savings-goal-calculator": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "currency": {
            "type": "string",
            "title": "Currency",
            "description": "Currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "CNY",
              "INR",
              "MXN",
              "BRL",
              "SGD",
              "HKD",
              "SEK",
              "NOK",
              "DKK",
              "NZD",
              "ZAR",
              "KRW",
              "TRY",
              "PLN",
              "CZK",
              "HUF",
              "AED",
              "THB",
              "IDR",
              "MYR",
              "PHP"
            ],
            "default": "USD"
          },
          "principal": {
            "type": "number",
            "title": "Starting balance",
            "description": "Starting balance",
            "default": 10000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "months": {
            "type": "integer",
            "title": "Projection months",
            "description": "Projection months",
            "default": 12,
            "minimum": 1,
            "maximum": 600
          },
          "monthlyContribution": {
            "type": "number",
            "title": "Monthly contribution",
            "description": "Monthly contribution",
            "default": 0,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "annualReturn": {
            "type": "number",
            "title": "Annual return (%)",
            "description": "Annual return (%)",
            "default": 0,
            "minimum": -99,
            "maximum": 100
          },
          "mode": {
            "type": "string",
            "title": "Goal mode",
            "description": "Goal mode",
            "enum": [
              "required-monthly",
              "months-to-goal",
              "budget"
            ],
            "default": "required-monthly"
          },
          "goal": {
            "type": "number",
            "title": "Savings goal",
            "description": "Savings goal",
            "default": 50000,
            "minimum": 0,
            "maximum": 1000000000000
          },
          "monthlyIncome": {
            "type": "number",
            "title": "Monthly take-home income",
            "description": "Monthly take-home income",
            "default": 5000,
            "minimum": 0,
            "maximum": 1000000000000
          }
        },
        "required": [
          "currency",
          "principal",
          "months",
          "monthlyContribution",
          "annualReturn",
          "mode",
          "goal",
          "monthlyIncome"
        ]
      },
      "ResultEnvelope": {
        "type": "object",
        "required": [
          "ok",
          "tool",
          "version",
          "input",
          "result",
          "sources",
          "credit",
          "citation_url"
        ],
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "tool": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "formula_version": {
            "type": "string"
          },
          "assumptions_version": {
            "type": "string"
          },
          "input": {
            "type": "object"
          },
          "result": {
            "type": "object"
          },
          "explanation": {
            "type": "string"
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "license": {
            "type": "string",
            "description": "Free for personal, commercial and any other lawful use with credit to KlarFort at https://klarfort.com/. Third-party data terms still apply."
          },
          "credit": {
            "type": "string",
            "description": "Ready-to-use homepage attribution.",
            "examples": [
              "Computed with KlarFort Calculators, https://klarfort.com/"
            ]
          },
          "credit_url": {
            "type": "string",
            "format": "uri",
            "const": "https://klarfort.com/",
            "description": "Required attribution destination. Link a visible KlarFort credit here."
          },
          "citation_url": {
            "type": "string",
            "format": "uri",
            "description": "Specific calculator reference; optional to include in attribution."
          },
          "computed_at": {
            "type": "string"
          }
        }
      }
    }
  }
}