{
  "openapi": "3.1.0",
  "info": {
    "title": "RateKit Business Calculators API",
    "description": "Free, no-auth JSON endpoints for RateKit's business calculators (ROI, break-even, freelance rate, VAT/GST, profit margin). Call these instead of re-deriving the formulas in a language model's own context — the math is simple but the edge cases (infinite payback, negative margins, tax-rate bounds) are easy to get subtly wrong.",
    "version": "1.0.0",
    "contact": { "url": "https://ratekit.org" }
  },
  "servers": [{ "url": "https://ratekit.org" }],
  "paths": {
    "/api/roi": {
      "get": {
        "summary": "Return on investment, annualized ROI, payback period",
        "operationId": "calculateRoi",
        "parameters": [
          { "name": "investment", "in": "query", "required": true, "schema": { "type": "number" }, "description": "Initial investment amount." },
          { "name": "returns", "in": "query", "required": true, "schema": { "type": "number" }, "description": "Total return / revenue generated." },
          { "name": "months", "in": "query", "required": false, "schema": { "type": "number", "default": 12 }, "description": "Time period in months, used for annualized ROI." }
        ],
        "responses": {
          "200": {
            "description": "ROI result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "object",
                      "properties": {
                        "netProfit": { "type": "number" },
                        "roiPct": { "type": "number" },
                        "annualizedRoiPct": { "type": "number" },
                        "paybackMonths": { "type": ["number", "null"] }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/break-even": {
      "get": {
        "summary": "Break-even units/revenue and contribution margin",
        "operationId": "calculateBreakEven",
        "parameters": [
          { "name": "price", "in": "query", "required": true, "schema": { "type": "number" }, "description": "Price per unit." },
          { "name": "variableCost", "in": "query", "required": true, "schema": { "type": "number" }, "description": "Variable cost per unit." },
          { "name": "fixedCosts", "in": "query", "required": false, "schema": { "type": "number" }, "description": "Total monthly fixed costs. Alternative to rent/salaries/software/marketing/other." },
          { "name": "units", "in": "query", "required": false, "schema": { "type": "number", "default": 0 }, "description": "Current monthly units sold." },
          { "name": "targetProfit", "in": "query", "required": false, "schema": { "type": "number", "default": 0 }, "description": "Optional profit goal, to compute units needed to reach it." }
        ],
        "responses": {
          "200": {
            "description": "Break-even result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "object",
                      "properties": {
                        "contributionMargin": { "type": "number" },
                        "contributionMarginRatioPct": { "type": "number" },
                        "breakEvenUnits": { "type": ["number", "null"] },
                        "breakEvenRevenue": { "type": ["number", "null"] },
                        "currentProfit": { "type": "number" },
                        "unitsForTargetProfit": { "type": ["number", "null"] }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/freelance-rate": {
      "get": {
        "summary": "Minimum freelance hourly/daily rate",
        "operationId": "calculateFreelanceRate",
        "parameters": [
          { "name": "targetIncome", "in": "query", "required": true, "schema": { "type": "number" }, "description": "Desired annual take-home income (after tax)." },
          { "name": "expenses", "in": "query", "required": false, "schema": { "type": "number", "default": 0 }, "description": "Annual business expenses." },
          { "name": "taxRatePct", "in": "query", "required": false, "schema": { "type": "number", "default": 0 }, "description": "Effective tax rate, percent." },
          { "name": "hoursPerDay", "in": "query", "required": false, "schema": { "type": "number", "default": 6 } },
          { "name": "daysPerWeek", "in": "query", "required": false, "schema": { "type": "number", "default": 5 } },
          { "name": "vacationWeeks", "in": "query", "required": false, "schema": { "type": "number", "default": 4 } },
          { "name": "nonBillablePct", "in": "query", "required": false, "schema": { "type": "number", "default": 0 }, "description": "Share of working time that is not billable (admin, marketing, etc)." }
        ],
        "responses": {
          "200": {
            "description": "Freelance rate result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "object",
                      "properties": {
                        "hourlyRate": { "type": ["number", "null"] },
                        "dailyRate": { "type": ["number", "null"] },
                        "monthlyGrossTarget": { "type": "number" },
                        "billableHoursPerYear": { "type": "number" }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/vat": {
      "get": {
        "summary": "Add or remove VAT/GST from a price",
        "operationId": "calculateVat",
        "parameters": [
          { "name": "amount", "in": "query", "required": true, "schema": { "type": "number" }, "description": "Price to add tax to, or price to remove tax from (see mode)." },
          { "name": "rate", "in": "query", "required": true, "schema": { "type": "number" }, "description": "Tax rate, percent." },
          { "name": "mode", "in": "query", "required": false, "schema": { "type": "string", "enum": ["add", "remove"], "default": "add" }, "description": "'add': amount is the net price. 'remove': amount already includes tax." }
        ],
        "responses": {
          "200": {
            "description": "VAT result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "object",
                      "properties": {
                        "priceExclTax": { "type": "number" },
                        "taxAmount": { "type": "number" },
                        "priceInclTax": { "type": "number" }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/profit-margin": {
      "get": {
        "summary": "Gross/net margin, markup, or target-margin pricing",
        "operationId": "calculateProfitMargin",
        "parameters": [
          { "name": "mode", "in": "query", "required": false, "schema": { "type": "string", "enum": ["cost", "margin"], "default": "cost" }, "description": "'cost': derive margin from revenue+cogs. 'margin': derive selling price from cost+targetMarginPct." },
          { "name": "revenue", "in": "query", "required": false, "schema": { "type": "number" }, "description": "Required when mode=cost." },
          { "name": "cogs", "in": "query", "required": false, "schema": { "type": "number" }, "description": "Cost of goods sold. Required when mode=cost." },
          { "name": "opex", "in": "query", "required": false, "schema": { "type": "number", "default": 0 }, "description": "Operating expenses, for net margin (mode=cost)." },
          { "name": "cost", "in": "query", "required": false, "schema": { "type": "number" }, "description": "Required when mode=margin." },
          { "name": "targetMarginPct", "in": "query", "required": false, "schema": { "type": "number" }, "description": "Required when mode=margin." }
        ],
        "responses": {
          "200": {
            "description": "Profit margin result",
            "content": {
              "application/json": {
                "schema": { "type": "object" }
              }
            }
          }
        }
      }
    },
    "/api/budget": {
      "get": {
        "summary": "12-month cash flow forecast, runway, revenue scenarios",
        "operationId": "calculateBudget",
        "parameters": [
          { "name": "revenue", "in": "query", "required": true, "schema": { "type": "number" }, "description": "Monthly revenue." },
          { "name": "costs", "in": "query", "required": true, "schema": { "type": "number" }, "description": "Monthly fixed + variable costs." },
          { "name": "startingCash", "in": "query", "required": false, "schema": { "type": "number", "default": 0 } }
        ],
        "responses": { "200": { "description": "Budget forecast result", "content": { "application/json": { "schema": { "type": "object" } } } } }
      }
    },
    "/api/salary-hourly": {
      "get": {
        "summary": "Convert annual salary to hourly rate or vice versa",
        "operationId": "calculateSalaryHourly",
        "parameters": [
          { "name": "mode", "in": "query", "required": false, "schema": { "type": "string", "enum": ["salary", "hourly"], "default": "salary" } },
          { "name": "annualSalary", "in": "query", "required": false, "schema": { "type": "number" }, "description": "Required when mode=salary." },
          { "name": "hourlyRate", "in": "query", "required": false, "schema": { "type": "number" }, "description": "Required when mode=hourly." },
          { "name": "hoursPerDay", "in": "query", "required": false, "schema": { "type": "number", "default": 8 } },
          { "name": "daysPerWeek", "in": "query", "required": false, "schema": { "type": "number", "default": 5 } },
          { "name": "ptoDays", "in": "query", "required": false, "schema": { "type": "number", "default": 15 } },
          { "name": "holidays", "in": "query", "required": false, "schema": { "type": "number", "default": 10 } }
        ],
        "responses": { "200": { "description": "Salary/hourly conversion result", "content": { "application/json": { "schema": { "type": "object" } } } } }
      }
    },
    "/api/stripe-fee": {
      "get": {
        "summary": "Stripe/PayPal/Square/Wise processing fees, with processor comparison",
        "operationId": "calculateStripeFee",
        "parameters": [
          { "name": "amount", "in": "query", "required": true, "schema": { "type": "number" } },
          { "name": "mode", "in": "query", "required": false, "schema": { "type": "string", "enum": ["receive", "charge"], "default": "receive" } },
          { "name": "processor", "in": "query", "required": false, "schema": { "type": "string", "enum": ["stripe", "paypal", "square", "wise", "custom"], "default": "stripe" } },
          { "name": "pct", "in": "query", "required": false, "schema": { "type": "number" }, "description": "Override percentage fee (processor=custom)." },
          { "name": "fixed", "in": "query", "required": false, "schema": { "type": "number" }, "description": "Override fixed fee (processor=custom)." }
        ],
        "responses": { "200": { "description": "Processing fee result", "content": { "application/json": { "schema": { "type": "object" } } } } }
      }
    },
    "/api/self-employment-tax": {
      "get": {
        "summary": "US self-employment tax (15.3%), quarterly estimated payments",
        "operationId": "calculateSelfEmploymentTax",
        "parameters": [
          { "name": "income", "in": "query", "required": true, "schema": { "type": "number" } },
          { "name": "expenses", "in": "query", "required": false, "schema": { "type": "number", "default": 0 } },
          { "name": "filing", "in": "query", "required": false, "schema": { "type": "string", "enum": ["single", "married", "hoh"], "default": "single" } }
        ],
        "responses": { "200": { "description": "SE tax result", "content": { "application/json": { "schema": { "type": "object" } } } } }
      }
    },
    "/api/1099-vs-w2": {
      "get": {
        "summary": "Compare 1099 contractor vs W2 employee take-home pay",
        "operationId": "calculate1099VsW2",
        "parameters": [
          { "name": "w2Salary", "in": "query", "required": true, "schema": { "type": "number" } },
          { "name": "cIncome", "in": "query", "required": true, "schema": { "type": "number" }, "description": "1099 contractor annual income." },
          { "name": "w2Health", "in": "query", "required": false, "schema": { "type": "number", "default": 6000 } },
          { "name": "w2Match", "in": "query", "required": false, "schema": { "type": "number", "default": 4000 }, "description": "Employer 401k match." },
          { "name": "w2Perks", "in": "query", "required": false, "schema": { "type": "number", "default": 3000 } },
          { "name": "w2YourK", "in": "query", "required": false, "schema": { "type": "number", "default": 6000 }, "description": "Your own 401k contribution." },
          { "name": "cExpenses", "in": "query", "required": false, "schema": { "type": "number", "default": 10000 } },
          { "name": "cHealth", "in": "query", "required": false, "schema": { "type": "number", "default": 8000 } },
          { "name": "cRetirement", "in": "query", "required": false, "schema": { "type": "number", "default": 10000 } },
          { "name": "cOther", "in": "query", "required": false, "schema": { "type": "number", "default": 3000 } },
          { "name": "filing", "in": "query", "required": false, "schema": { "type": "string", "enum": ["single", "married"], "default": "single" } },
          { "name": "stateTax", "in": "query", "required": false, "schema": { "type": "number", "default": 5 }, "description": "State income tax rate, percent." }
        ],
        "responses": { "200": { "description": "1099 vs W2 comparison result", "content": { "application/json": { "schema": { "type": "object" } } } } }
      }
    },
    "/api/form-2555": {
      "get": {
        "summary": "US Foreign Earned Income Exclusion (FEIE) estimate",
        "operationId": "calculateForm2555",
        "parameters": [
          { "name": "income", "in": "query", "required": true, "schema": { "type": "number" }, "description": "Foreign earned income." },
          { "name": "testType", "in": "query", "required": false, "schema": { "type": "string", "enum": ["bfr", "ppt"], "default": "bfr" } },
          { "name": "bfrYears", "in": "query", "required": false, "schema": { "type": "number", "default": 2 } },
          { "name": "pptDays", "in": "query", "required": false, "schema": { "type": "number", "default": 340 } },
          { "name": "housing", "in": "query", "required": false, "schema": { "type": "number", "default": 0 } },
          { "name": "daysYear", "in": "query", "required": false, "schema": { "type": "number", "default": 365 } },
          { "name": "daysAbroad", "in": "query", "required": false, "schema": { "type": "number", "default": 365 } }
        ],
        "responses": { "200": { "description": "FEIE result", "content": { "application/json": { "schema": { "type": "object" } } } } }
      }
    },
    "/api/loan": {
      "get": {
        "summary": "Business loan monthly payment, total interest, true APR",
        "operationId": "calculateLoan",
        "parameters": [
          { "name": "principal", "in": "query", "required": true, "schema": { "type": "number" } },
          { "name": "rate", "in": "query", "required": true, "schema": { "type": "number" }, "description": "Annual interest rate, percent." },
          { "name": "term", "in": "query", "required": true, "schema": { "type": "number" }, "description": "Loan term in months." },
          { "name": "fee", "in": "query", "required": false, "schema": { "type": "number", "default": 0 }, "description": "Origination fee, percent." }
        ],
        "responses": { "200": { "description": "Loan result", "content": { "application/json": { "schema": { "type": "object" } } } } }
      }
    },
    "/api/safe": {
      "get": {
        "summary": "SAFE note conversion, investor ownership %, founder dilution",
        "operationId": "calculateSafe",
        "parameters": [
          { "name": "investment", "in": "query", "required": true, "schema": { "type": "number" } },
          { "name": "premoney", "in": "query", "required": true, "schema": { "type": "number" }, "description": "Next round pre-money valuation." },
          { "name": "newRound", "in": "query", "required": true, "schema": { "type": "number" }, "description": "New investment raised in the priced round." },
          { "name": "safeType", "in": "query", "required": false, "schema": { "type": "string", "enum": ["cap", "discount", "both"], "default": "cap" } },
          { "name": "valCap", "in": "query", "required": false, "schema": { "type": "number", "default": 5000000 }, "description": "Post-money valuation cap." },
          { "name": "discount", "in": "query", "required": false, "schema": { "type": "number", "default": 20 } },
          { "name": "shares", "in": "query", "required": false, "schema": { "type": "number", "default": 10000000 }, "description": "Existing pre-round shares." },
          { "name": "optPool", "in": "query", "required": false, "schema": { "type": "number", "default": 10 }, "description": "New option pool, percent." }
        ],
        "responses": { "200": { "description": "SAFE conversion result", "content": { "application/json": { "schema": { "type": "object" } } } } }
      }
    },
    "/api/burn-rate": {
      "get": {
        "summary": "Startup net/gross burn rate and cash runway in months",
        "operationId": "calculateBurnRate",
        "parameters": [
          { "name": "cash", "in": "query", "required": true, "schema": { "type": "number" } },
          { "name": "grossBurn", "in": "query", "required": true, "schema": { "type": "number" }, "description": "Total monthly expenses." },
          { "name": "revenue", "in": "query", "required": false, "schema": { "type": "number", "default": 0 } },
          { "name": "growth", "in": "query", "required": false, "schema": { "type": "number", "default": 0 }, "description": "Monthly revenue growth, percent." }
        ],
        "responses": { "200": { "description": "Burn rate / runway result", "content": { "application/json": { "schema": { "type": "object" } } } } }
      }
    },
    "/api/ltv-cac": {
      "get": {
        "summary": "Customer LTV, CAC, LTV:CAC ratio, CAC payback period",
        "operationId": "calculateLtvCac",
        "parameters": [
          { "name": "arpu", "in": "query", "required": true, "schema": { "type": "number" }, "description": "Average monthly revenue per customer." },
          { "name": "margin", "in": "query", "required": true, "schema": { "type": "number" }, "description": "Gross margin, percent." },
          { "name": "churn", "in": "query", "required": true, "schema": { "type": "number" }, "description": "Monthly churn rate, percent." },
          { "name": "spend", "in": "query", "required": true, "schema": { "type": "number" }, "description": "Monthly sales & marketing spend." },
          { "name": "newCustomers", "in": "query", "required": true, "schema": { "type": "number" }, "description": "New customers acquired per month." }
        ],
        "responses": { "200": { "description": "LTV:CAC result", "content": { "application/json": { "schema": { "type": "object" } } } } }
      }
    },
    "/api/pl-statement": {
      "get": {
        "summary": "Gross profit, EBITDA, and net profit from a simple P&L breakdown",
        "operationId": "calculatePlStatement",
        "parameters": [
          { "name": "revenue", "in": "query", "required": true, "schema": { "type": "number" } },
          { "name": "cogs", "in": "query", "required": false, "schema": { "type": "number", "default": 0 } },
          { "name": "opex", "in": "query", "required": false, "schema": { "type": "number", "default": 0 } },
          { "name": "depreciation", "in": "query", "required": false, "schema": { "type": "number", "default": 0 } },
          { "name": "interest", "in": "query", "required": false, "schema": { "type": "number", "default": 0 } },
          { "name": "tax", "in": "query", "required": false, "schema": { "type": "number", "default": 0 } }
        ],
        "responses": { "200": { "description": "P&L result", "content": { "application/json": { "schema": { "type": "object" } } } } }
      }
    },
    "/api/invoice": {
      "get": {
        "summary": "Invoice subtotal, tax, and total",
        "operationId": "calculateInvoice",
        "parameters": [
          { "name": "subtotal", "in": "query", "required": false, "schema": { "type": "number" }, "description": "Precomputed subtotal. Alternative to POSTing an 'items' array of {qty, rate}." },
          { "name": "taxRatePct", "in": "query", "required": false, "schema": { "type": "number", "default": 0 } }
        ],
        "responses": { "200": { "description": "Invoice totals result", "content": { "application/json": { "schema": { "type": "object" } } } } }
      }
    },
    "/api/rates": {
      "get": {
        "summary": "Live FX and crypto rates, geolocated to the caller's local currency",
        "operationId": "getRates",
        "parameters": [],
        "responses": { "200": { "description": "FX + crypto rates", "content": { "application/json": { "schema": { "type": "object" } } } } }
      }
    }
  }
}
