{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://klarfort.com/tools/debt-payoff-calculator/schema.json",
  "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"
  ]
}