# Investboard calculator API: agent quick start

Model version: 2026-10-15.2
Base: https://investboard.com/api/v1/public/calculators
Catalog: https://investboard.com/api/v1/public/calculators
OpenAPI 3.1: https://investboard.com/api/v1/public/calculators/openapi.json
Browser documentation: https://investboard.com/calculators/api
Methodology: https://investboard.com/calculators/api/methodology
Methodology as Markdown: https://investboard.com/api/v1/public/portfolio-analysis/methodology (locale=en or locale=de)
Portfolio overlap, costs and diversification from supplied holdings: https://investboard.com/api/v1/public/portfolio-analysis/guide

Anonymous, stateless German financial models. No account, API key or MCP required.
The models do not fetch live prices or read account data.

## Choose the model

| Calculator identifier | Question it answers |
| --- | --- |
| abgeltungssteuer | Estimate German tax on capital income, share sales or equity-fund gains. |
| netto-dividende | Convert a gross dividend to net income, with optional country withholding assumptions. |
| vorabpauschale | Estimate advance tax on one fund position held for a full year. |
| thesaurierer-vs-ausschuetter | Compare modeled wealth from accumulating and distributing funds. |
| freistellungsauftrag | Allocate the annual saver allowance across up to six broker rows. |
| etf-sparplan | Project an ETF savings plan with optional modeled tax drag. |
| notgroschen | Size an emergency reserve and model the time needed to save it. |
| eigenkapital | Estimate property upfront equity, purchase costs and savings time. |
| rentenluecke | Estimate a German statutory pension gap and the savings needed to fund it. |
| entnahmeplan | Model portfolio withdrawals, tax and depletion over the model horizon. |
| schenkungsteuer | Estimate gift tax or schedule gifts across allowance windows without prior gifts. |
| junior-depot | Project a child's investment account, including modeled Kindergeld and NV options. |
| fire-rechner | Estimate Regular, Coast or Barista FIRE targets in today's euros. |

## Follow this workflow

1. Choose a calculator, then GET its endpoint for inputSchema, resultSchema, defaults and operationId.
2. Ask for material missing assumptions rather than silently presenting defaults as the person's facts.
3. Send JSON numbers in EUR. Input rates are percentage points: 6 means 6%, not 0.06. Do not send formatted amounts.
4. POST an inputs object, optional locale (en or de) and optional asOf (YYYY-MM-DD, current UTC date by default). asOf is a savings reference date, not the tax year. Vorabpauschale has an explicit steuerjahr.
5. Check HTTP status and error before reading data. Read resultSchema for field units and null meanings; never convert null to zero. Result tax rates are fractions; fields ending _pct, basiszins and effectiveWithdrawalRate are percentage points.
6. State the assumptions and relevant limitations with the result. Assumed returns are not forecasts. Use sources as supplied by the model.
7. Return data.links.calculator so the person can inspect and edit the calculation. Keep result, asOf and modelVersion if a historical record is required. Links preserve inputs, not historical executable models.

## Complete request and response

This compact example models one year, with EUR 500 contributed monthly and an assumed 6% annual return. It is not a forecast.

```sh
curl 'https://investboard.com/api/v1/public/calculators/etf-sparplan' -H 'Content-Type: application/json' --data '{"inputs":{"monthly_rate":500,"annual_return":6,"annual_increase":0,"years":1},"locale":"en","asOf":"2026-10-15"}'
```

```json
{
  "data": {
    "calculator": "etf-sparplan",
    "modelVersion": "2026-10-15.2",
    "inputs": {
      "initial_investment": 0,
      "monthly_rate": 500,
      "annual_increase": 0,
      "annual_return": 6,
      "years": 1,
      "include_tax_drag": false,
      "fondstyp": "AKTIENFONDS",
      "taxProfile": {
        "bundesland": null,
        "kirchensteuer": false,
        "filing_status": "single",
        "sparerpauschbetrag_remaining": 1000
      }
    },
    "asOf": "2026-10-15",
    "result": {
      "yearly_data": [
        {
          "year": 1,
          "contributions_cumulative": 6000,
          "value_before_tax": 6198.62,
          "value_after_tax": 6198.62,
          "annual_contribution": 6000,
          "vorabpauschale_tax": 0
        }
      ],
      "final_value": 6198.62,
      "total_contributions": 6000,
      "total_growth": 198.62,
      "total_taxes_paid": 0,
      "final_value_no_tax": 6198.62,
      "tax_drag_eur": 0,
      "tax_drag_pct": 0
    },
    "assumptions": [
      "Amounts are EUR; input rates are percentage points (6 means 6%). Return assumptions are modeled, not market forecasts.",
      "German tax parameters: 2026. Multi-year models hold current parameters constant.",
      "Savings path: Initial capital and the savings rate compound monthly; the rate optionally rises each year by the chosen escalation.",
      "Tax drag: With tax enabled, the advance lump sum is calculated each year (base rate, 70% factor, partial exemption by fund type, saver's allowance) and deducted from the portfolio value.",
      "Result: The output shows final wealth with and without tax, contributions, growth and the year-by-year path."
    ],
    "limitations": [
      "The return is a constant assumption; real market returns can differ. Fund costs and inflation are not modeled.",
      "No sale tax is deducted at the end of the term; final wealth is calculated before disposal.",
      "Links preserve inputs and the reference date, not historical model code; a later model update may change the result."
    ],
    "sources": [
      "German Investment Tax Act section 18 for the advance lump sum and section 20 for partial exemptions.",
      "German Income Tax Act section 20 paragraph 9 for the saver's allowance; Federal Ministry of Finance base rate by tax year.",
      "User assumptions for return, savings rate, escalation and duration."
    ],
    "links": {
      "calculator": "https://investboard.com/calculators/etf-savings-plan?initial_investment=0&monthly_rate=500&annual_increase=0&annual_return=6&years=1&include_tax_drag=false&fondstyp=AKTIENFONDS&taxProfile.bundesland=null&taxProfile.kirchensteuer=false&taxProfile.filing_status=single&taxProfile.sparerpauschbetrag_remaining=1000&asOf=2026-10-15&modelVersion=2026-10-15.2&via=api",
      "methodology": "https://investboard.com/calculators/etf-savings-plan",
      "documentation": "https://investboard.com/calculators/api"
    }
  },
  "error": null,
  "meta": {}
}
```

## Compare scenarios

POST https://investboard.com/api/v1/public/calculators/compare with one calculator and 2 to 10 independent scenarios. Scenario ids must be unique. Each scenario has its own inputs; defaults apply separately. All scenarios share asOf, locale and modelVersion. They are returned in request order.

```json
{
  "calculator": "etf-sparplan",
  "asOf": "2026-10-15",
  "locale": "en",
  "scenarios": [
    {
      "id": "monthly-300",
      "inputs": {
        "monthly_rate": 300,
        "annual_return": 6,
        "annual_increase": 0,
        "years": 20
      }
    },
    {
      "id": "monthly-500",
      "inputs": {
        "monthly_rate": 500,
        "annual_return": 6,
        "annual_increase": 0,
        "years": 20
      }
    },
    {
      "id": "monthly-700",
      "inputs": {
        "monthly_rate": 700,
        "annual_return": 6,
        "annual_increase": 0,
        "years": 20
      }
    }
  ]
}
```

The response envelope's data contains calculator, modelVersion, asOf, summary (succeeded and failed counts), and scenarios. Each scenarios entry contains id plus either data (a full calculation with its own browser link) and error: null, or data: null and an error. HTTP 200 can contain scenario errors: inspect every entry. Structural request errors return HTTP 400; unexpected engine failures return HTTP 500.

## Readable browser links

Example: https://investboard.com/calculators/etf-savings-plan?monthly_rate=500&annual_return=6&years=20

Use the input field names as query parameters. Scalars use JSON number/boolean spellings; tax profiles use dotted keys such as taxProfile.filing_status=joint. brokers is a JSON array. Optional asOf and modelVersion preserve context. Omitted fields use defaults, so use the complete returned link to preserve the exact normalized inputs. Legacy scenario JSON links remain supported. Do not mix the two formats. The calculator's copy button copies the current edited inputs.

## Limits and failure handling

- JSON bodies: at most 16 KiB. Comparisons: at most 10 scenarios.
- Shared per-IP allowance: 60 units per minute. Ordinary API requests cost one; a comparison costs one per scenario. A rejected/invalid request can still consume units. Limiting is best-effort during Redis outages.
- HTTP 400: repair invalid fields or assumptions. HTTP 404: unknown calculator. HTTP 413: shorten the body. HTTP 429: wait for Retry-After in seconds. HTTP 500: retry with backoff; include the response request id when reporting it.
- Cross-origin browser calls use credentials: omit.
- Vorabpauschale supports a single full-year position. Gift scheduling requires zero prior gifts. Kindergeld mode uses the fixed model benefit instead of the supplied monthlyContribution.
- An unfunded savings goal with zero saving capacity may return zero months: inspect deficit and targetUnreachable. FIRE yearsToFire: null means the 50-year horizon was not reached. Withdrawal yearsUntilDepletion: null means no depletion inside the model horizon; it does not show that the withdrawals last for life.

## Privacy

Inputs are visible in shared URLs. Use generic broker names and share only values the recipient may see. API responses use Cache-Control: no-store and do not save account data. URLs can appear in browser history and infrastructure logs. Operational usage events contain only calculator identifiers, operation, status, timings, counts and allowlisted validation field names. Browser scenario-open/copy events are consent-dependent and exclude input values; calculator URL queries are scrubbed before browser analytics transmission.
