Investboard / developer reference
Analyze your own portfolio or run the same models as our public calculators. Send JSON and receive results with their assumptions, coverage and limitations. Calculator results also include an editable browser link.
This example models an ETF savings plan using an assumed annual return. It does not forecast investment performance. Omitted input fields use the defaults published in each schema.
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": 20
},
"locale": "en",
"asOf": "2026-10-15"
}'{
"data": {
"calculator": "etf-sparplan",
"modelVersion": "2026-11-10.3",
"inputs": {
"initial_investment": 0,
"monthly_rate": 500,
"annual_increase": 0,
"annual_return": 6,
"projection_basis": "custom",
"projection_spread": 2,
"years": 20,
"include_tax_drag": false,
"fondstyp": "AKTIENFONDS",
"taxProfile": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"currency": "EUR"
},
"asOf": "2026-10-15",
"result": {
"final_value": 227822.88,
"total_contributions": 120000,
"total_growth": 107822.88
},
"links": {
"calculator": "https://investboard.com/calculators/wealth-growth?initial_investment=0&monthly_rate=500&annual_increase=0&annual_return=6&projection_basis=custom&projection_spread=2&years=20&include_tax_drag=false&fondstyp=AKTIENFONDS&taxProfile.bundesland=null&taxProfile.kirchensteuer=false&taxProfile.filing_status=single&taxProfile.sparerpauschbetrag_remaining=1000¤cy=EUR&asOf=2026-10-15&modelVersion=2026-11-10.3&via=api",
"methodology": "https://investboard.com/calculators/wealth-growth",
"documentation": "https://investboard.com/calculators/api"
}
},
"error": null,
"meta": {}
}Every example and input schema below is generated from the validation contract used by the endpoint. GET the endpoint to retrieve its schema and defaults without running a calculation.
Calculate Kapitalertragsteuer (capital gains tax), Solidaritätszuschlag (solidarity surcharge), and Kirchensteuer (church tax) on your capital earnings.
POST /api/v1/public/calculators/abgeltungssteuer
{
"inputs": {
"kapitalertrag": 5000,
"ertragsart": "general",
"taxProfile": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
}
},
"locale": "en"
}{
"type": "object",
"properties": {
"kapitalertrag": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 5000,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"ertragsart": {
"type": "string",
"enum": [
"general",
"aktienverkauf",
"dividende",
"etf"
],
"default": "general"
},
"taxProfile": {
"type": "object",
"properties": {
"bundesland": {
"anyOf": [
{
"type": "string",
"enum": [
"Baden-Württemberg",
"Bayern",
"Berlin",
"Brandenburg",
"Bremen",
"Hamburg",
"Hessen",
"Mecklenburg-Vorpommern",
"Niedersachsen",
"Nordrhein-Westfalen",
"Rheinland-Pfalz",
"Saarland",
"Sachsen",
"Sachsen-Anhalt",
"Schleswig-Holstein",
"Thüringen"
]
},
{
"type": "null"
}
],
"default": null
},
"kirchensteuer": {
"type": "boolean",
"default": false
},
"filing_status": {
"type": "string",
"enum": [
"single",
"joint"
],
"default": "single"
},
"sparerpauschbetrag_remaining": {
"type": "number",
"minimum": 0,
"maximum": 2000,
"default": 1000,
"description": "Remaining EUR allowance for single-year tax calculations. Multi-year projections use the full annual statutory allowance based on filing_status."
}
},
"default": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"brutto_ertrag": {
"type": "number",
"description": "EUR, not cents."
},
"fsa_offset": {
"type": "number",
"description": "EUR, not cents."
},
"steuerpflichtiger_ertrag": {
"type": "number",
"description": "EUR, not cents."
},
"kapitalertragsteuer": {
"type": "number",
"description": "EUR, not cents."
},
"solidaritaetszuschlag": {
"type": "number",
"description": "EUR, not cents."
},
"kirchensteuer": {
"type": "number",
"description": "EUR, not cents."
},
"gesamte_steuer": {
"type": "number",
"description": "EUR, not cents."
},
"effektiver_steuersatz": {
"type": "number",
"description": "Fraction: 0.25 means 25%."
},
"netto_ertrag": {
"type": "number",
"description": "EUR, not cents."
},
"kirchensteuer_rate": {
"type": "number",
"description": "Fraction: 0.25 means 25%."
},
"teilfreistellung_betrag": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"brutto_ertrag",
"fsa_offset",
"steuerpflichtiger_ertrag",
"kapitalertragsteuer",
"solidaritaetszuschlag",
"kirchensteuer",
"gesamte_steuer",
"effektiver_steuersatz",
"netto_ertrag",
"kirchensteuer_rate",
"teilfreistellung_betrag"
],
"additionalProperties": false
}What remains of your dividend after Abgeltungsteuer, solidarity surcharge, and church tax?
POST /api/v1/public/calculators/netto-dividende
{
"inputs": {
"brutto_dividende": 500,
"quelle": "aktie",
"taxProfile": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
}
},
"locale": "en"
}{
"type": "object",
"properties": {
"brutto_dividende": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 500,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"quelle": {
"type": "string",
"enum": [
"aktie",
"etf_aktien",
"mischfonds"
],
"default": "aktie"
},
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$",
"description": "Optional issuer ISIN used for country-level withholding assumptions; not a live security lookup."
},
"taxProfile": {
"type": "object",
"properties": {
"bundesland": {
"anyOf": [
{
"type": "string",
"enum": [
"Baden-Württemberg",
"Bayern",
"Berlin",
"Brandenburg",
"Bremen",
"Hamburg",
"Hessen",
"Mecklenburg-Vorpommern",
"Niedersachsen",
"Nordrhein-Westfalen",
"Rheinland-Pfalz",
"Saarland",
"Sachsen",
"Sachsen-Anhalt",
"Schleswig-Holstein",
"Thüringen"
]
},
{
"type": "null"
}
],
"default": null
},
"kirchensteuer": {
"type": "boolean",
"default": false
},
"filing_status": {
"type": "string",
"enum": [
"single",
"joint"
],
"default": "single"
},
"sparerpauschbetrag_remaining": {
"type": "number",
"minimum": 0,
"maximum": 2000,
"default": 1000,
"description": "Remaining EUR allowance for single-year tax calculations. Multi-year projections use the full annual statutory allowance based on filing_status."
}
},
"default": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"brutto_dividende": {
"type": "number",
"description": "EUR, not cents."
},
"teilfreistellung_rate": {
"type": "number",
"description": "Fraction: 0.25 means 25%."
},
"teilfreistellung_betrag": {
"type": "number",
"description": "EUR, not cents."
},
"steuerpflichtiger_betrag": {
"type": "number",
"description": "EUR, not cents."
},
"steuer": {
"type": "object",
"properties": {
"brutto_ertrag": {
"type": "number",
"description": "EUR, not cents."
},
"fsa_offset": {
"type": "number",
"description": "EUR, not cents."
},
"steuerpflichtiger_ertrag": {
"type": "number",
"description": "EUR, not cents."
},
"kapitalertragsteuer": {
"type": "number",
"description": "EUR, not cents."
},
"solidaritaetszuschlag": {
"type": "number",
"description": "EUR, not cents."
},
"kirchensteuer": {
"type": "number",
"description": "EUR, not cents."
},
"gesamte_steuer": {
"type": "number",
"description": "EUR, not cents."
},
"effektiver_steuersatz": {
"type": "number",
"description": "Fraction: 0.25 means 25%."
},
"netto_ertrag": {
"type": "number",
"description": "EUR, not cents."
},
"kirchensteuer_rate": {
"type": "number",
"description": "Fraction: 0.25 means 25%."
}
},
"required": [
"brutto_ertrag",
"fsa_offset",
"steuerpflichtiger_ertrag",
"kapitalertragsteuer",
"solidaritaetszuschlag",
"kirchensteuer",
"gesamte_steuer",
"effektiver_steuersatz",
"netto_ertrag",
"kirchensteuer_rate"
],
"additionalProperties": false
},
"quellensteuer_rate": {
"type": "number",
"description": "Fraction: 0.25 means 25%."
},
"quellensteuer_betrag": {
"type": "number",
"description": "EUR, not cents."
},
"anrechenbare_quellensteuer": {
"type": "number",
"description": "EUR, not cents."
},
"erstattungsfaehige_quellensteuer": {
"type": "number",
"description": "EUR, not cents."
},
"deutsche_reststeuer": {
"type": "number",
"description": "EUR, not cents."
},
"quellensteuer_status": {
"type": "string",
"enum": [
"credited",
"fund_level",
"none",
"unavailable"
],
"description": "unavailable means withholding was omitted because country assumptions are unavailable; none means no modeled investor withholding."
},
"netto_dividende": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"brutto_dividende",
"teilfreistellung_rate",
"teilfreistellung_betrag",
"steuerpflichtiger_betrag",
"steuer",
"quellensteuer_rate",
"quellensteuer_betrag",
"anrechenbare_quellensteuer",
"erstattungsfaehige_quellensteuer",
"deutsche_reststeuer",
"quellensteuer_status",
"netto_dividende"
],
"additionalProperties": false
}Calculate the advance lump sum tax on your ETFs and funds, for the 2024 to 2026 tax years, each due in January of the following year.
POST /api/v1/public/calculators/vorabpauschale
{
"inputs": {
"wert_jahresanfang": 10000,
"wert_jahresende": 11500,
"ausschuettungen": 0,
"fondstyp": "AKTIENFONDS",
"steuerjahr": 2026,
"taxProfile": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
}
},
"locale": "en"
}{
"type": "object",
"properties": {
"wert_jahresanfang": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 10000,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"wert_jahresende": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 11500,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"ausschuettungen": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"fondstyp": {
"type": "string",
"enum": [
"AKTIENFONDS",
"MISCHFONDS",
"IMMOBILIENFONDS",
"IMMOBILIENFONDS_AUSLAND",
"SONSTIGE"
],
"default": "AKTIENFONDS"
},
"steuerjahr": {
"anyOf": [
{
"type": "number",
"enum": [
2023
]
},
{
"type": "number",
"enum": [
2024
]
},
{
"type": "number",
"enum": [
2025
]
},
{
"type": "number",
"enum": [
2026
]
}
],
"default": 2026,
"description": "Only years with published Basiszins in the model are accepted. Single-position, full-year holding."
},
"taxProfile": {
"type": "object",
"properties": {
"bundesland": {
"anyOf": [
{
"type": "string",
"enum": [
"Baden-Württemberg",
"Bayern",
"Berlin",
"Brandenburg",
"Bremen",
"Hamburg",
"Hessen",
"Mecklenburg-Vorpommern",
"Niedersachsen",
"Nordrhein-Westfalen",
"Rheinland-Pfalz",
"Saarland",
"Sachsen",
"Sachsen-Anhalt",
"Schleswig-Holstein",
"Thüringen"
]
},
{
"type": "null"
}
],
"default": null
},
"kirchensteuer": {
"type": "boolean",
"default": false
},
"filing_status": {
"type": "string",
"enum": [
"single",
"joint"
],
"default": "single"
},
"sparerpauschbetrag_remaining": {
"type": "number",
"minimum": 0,
"maximum": 2000,
"default": 1000,
"description": "Remaining EUR allowance for single-year tax calculations. Multi-year projections use the full annual statutory allowance based on filing_status."
}
},
"default": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"basiszins": {
"type": "number",
"description": "Percentage points: 4 means 4%."
},
"basisertrag": {
"type": "number",
"description": "EUR, not cents."
},
"wertsteigerung": {
"type": "number",
"description": "EUR, not cents."
},
"vorabpauschale_brutto": {
"type": "number",
"description": "EUR, not cents."
},
"teilfreistellung_rate": {
"type": "number",
"description": "Fraction: 0.25 means 25%."
},
"teilfreistellung_betrag": {
"type": "number",
"description": "EUR, not cents."
},
"vorabpauschale_steuerpflichtig": {
"type": "number",
"description": "EUR, not cents."
},
"steuer": {
"type": "object",
"properties": {
"brutto_ertrag": {
"type": "number",
"description": "EUR, not cents."
},
"fsa_offset": {
"type": "number",
"description": "EUR, not cents."
},
"steuerpflichtiger_ertrag": {
"type": "number",
"description": "EUR, not cents."
},
"kapitalertragsteuer": {
"type": "number",
"description": "EUR, not cents."
},
"solidaritaetszuschlag": {
"type": "number",
"description": "EUR, not cents."
},
"kirchensteuer": {
"type": "number",
"description": "EUR, not cents."
},
"gesamte_steuer": {
"type": "number",
"description": "EUR, not cents."
},
"effektiver_steuersatz": {
"type": "number",
"description": "Fraction: 0.25 means 25%."
},
"netto_ertrag": {
"type": "number",
"description": "EUR, not cents."
},
"kirchensteuer_rate": {
"type": "number",
"description": "Fraction: 0.25 means 25%."
}
},
"required": [
"brutto_ertrag",
"fsa_offset",
"steuerpflichtiger_ertrag",
"kapitalertragsteuer",
"solidaritaetszuschlag",
"kirchensteuer",
"gesamte_steuer",
"effektiver_steuersatz",
"netto_ertrag",
"kirchensteuer_rate"
],
"additionalProperties": false
}
},
"required": [
"basiszins",
"basisertrag",
"wertsteigerung",
"vorabpauschale_brutto",
"teilfreistellung_rate",
"teilfreistellung_betrag",
"vorabpauschale_steuerpflichtig",
"steuer"
],
"additionalProperties": false
}Which ETF type gives you more wealth after German taxes? Long-term comparison with Vorabpauschale, partial exemption, and saver's allowance.
POST /api/v1/public/calculators/thesaurierer-vs-ausschuetter
{
"inputs": {
"initial_investment": 10000,
"monthly_contribution": 300,
"annual_return": 7,
"distribution_yield": 2,
"years": 20,
"fondstyp": "AKTIENFONDS",
"reinvest_distributions": true,
"taxProfile": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
}
},
"locale": "en"
}{
"type": "object",
"properties": {
"initial_investment": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 10000,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"monthly_contribution": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 300,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"annual_return": {
"type": "number",
"minimum": 1,
"maximum": 15,
"default": 7,
"description": "Annual percentage points: 6 means 6%, not 0.06."
},
"distribution_yield": {
"type": "number",
"minimum": 0,
"maximum": 6,
"default": 2,
"description": "Annual percentage points: 6 means 6%, not 0.06."
},
"years": {
"type": "integer",
"minimum": 1,
"maximum": 40,
"default": 20
},
"fondstyp": {
"type": "string",
"enum": [
"AKTIENFONDS",
"MISCHFONDS",
"SONSTIGE"
],
"default": "AKTIENFONDS"
},
"reinvest_distributions": {
"type": "boolean",
"default": true
},
"taxProfile": {
"type": "object",
"properties": {
"bundesland": {
"anyOf": [
{
"type": "string",
"enum": [
"Baden-Württemberg",
"Bayern",
"Berlin",
"Brandenburg",
"Bremen",
"Hamburg",
"Hessen",
"Mecklenburg-Vorpommern",
"Niedersachsen",
"Nordrhein-Westfalen",
"Rheinland-Pfalz",
"Saarland",
"Sachsen",
"Sachsen-Anhalt",
"Schleswig-Holstein",
"Thüringen"
]
},
{
"type": "null"
}
],
"default": null
},
"kirchensteuer": {
"type": "boolean",
"default": false
},
"filing_status": {
"type": "string",
"enum": [
"single",
"joint"
],
"default": "single"
},
"sparerpauschbetrag_remaining": {
"type": "number",
"minimum": 0,
"maximum": 2000,
"default": 1000,
"description": "Remaining EUR allowance for single-year tax calculations. Multi-year projections use the full annual statutory allowance based on filing_status."
}
},
"default": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"yearly_data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"year": {
"type": "integer",
"minimum": 0,
"description": "Year index from the start of the projection."
},
"thesaurierer_value": {
"type": "number",
"description": "EUR, not cents."
},
"thesaurierer_vorabpauschale_tax": {
"type": "number",
"description": "EUR, not cents."
},
"ausschuetter_value": {
"type": "number",
"description": "EUR, not cents."
},
"ausschuetter_distribution_tax": {
"type": "number",
"description": "EUR, not cents."
},
"ausschuetter_vorabpauschale_tax": {
"type": "number",
"description": "EUR, not cents."
},
"ausschuetter_distributions_gross": {
"type": "number",
"description": "EUR, not cents."
},
"ausschuetter_distributions_net": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"year",
"thesaurierer_value",
"thesaurierer_vorabpauschale_tax",
"ausschuetter_value",
"ausschuetter_distribution_tax",
"ausschuetter_vorabpauschale_tax",
"ausschuetter_distributions_gross",
"ausschuetter_distributions_net"
],
"additionalProperties": false
}
},
"thesaurierer_final": {
"type": "number",
"description": "EUR, not cents."
},
"ausschuetter_final": {
"type": "number",
"description": "EUR, not cents."
},
"thesaurierer_advantage_eur": {
"type": "number",
"description": "EUR, not cents."
},
"thesaurierer_advantage_pct": {
"type": "number",
"description": "Percentage points: 4 means 4%."
},
"thesaurierer_total_taxes": {
"type": "number",
"description": "EUR, not cents."
},
"ausschuetter_total_taxes": {
"type": "number",
"description": "EUR, not cents."
},
"total_contributions": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"yearly_data",
"thesaurierer_final",
"ausschuetter_final",
"thesaurierer_advantage_eur",
"thesaurierer_advantage_pct",
"thesaurierer_total_taxes",
"ausschuetter_total_taxes",
"total_contributions"
],
"additionalProperties": false
}Distribute your saver's allowance across banks and brokers without leaving allowance unused.
POST /api/v1/public/calculators/freistellungsauftrag
{
"inputs": {
"brokers": [
{
"name": "Broker 1",
"zinsen": 0,
"dividenden": 0,
"vorabpauschale": 0,
"realisierte_gewinne": 0,
"current_fsa": 0
},
{
"name": "Broker 2",
"zinsen": 0,
"dividenden": 0,
"vorabpauschale": 0,
"realisierte_gewinne": 0,
"current_fsa": 0
}
],
"taxProfile": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
}
},
"locale": "en"
}{
"type": "object",
"properties": {
"brokers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"zinsen": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"dividenden": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"vorabpauschale": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"realisierte_gewinne": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"current_fsa": {
"type": "number",
"minimum": 0,
"maximum": 2000,
"default": 0,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
}
},
"required": [
"name"
],
"additionalProperties": false
},
"minItems": 1,
"maxItems": 6,
"default": [
{
"name": "Broker 1",
"zinsen": 0,
"dividenden": 0,
"vorabpauschale": 0,
"realisierte_gewinne": 0,
"current_fsa": 0
},
{
"name": "Broker 2",
"zinsen": 0,
"dividenden": 0,
"vorabpauschale": 0,
"realisierte_gewinne": 0,
"current_fsa": 0
}
]
},
"taxProfile": {
"type": "object",
"properties": {
"bundesland": {
"anyOf": [
{
"type": "string",
"enum": [
"Baden-Württemberg",
"Bayern",
"Berlin",
"Brandenburg",
"Bremen",
"Hamburg",
"Hessen",
"Mecklenburg-Vorpommern",
"Niedersachsen",
"Nordrhein-Westfalen",
"Rheinland-Pfalz",
"Saarland",
"Sachsen",
"Sachsen-Anhalt",
"Schleswig-Holstein",
"Thüringen"
]
},
{
"type": "null"
}
],
"default": null
},
"kirchensteuer": {
"type": "boolean",
"default": false
},
"filing_status": {
"type": "string",
"enum": [
"single",
"joint"
],
"default": "single"
},
"sparerpauschbetrag_remaining": {
"type": "number",
"minimum": 0,
"maximum": 2000,
"default": 1000,
"description": "Remaining EUR allowance for single-year tax calculations. Multi-year projections use the full annual statutory allowance based on filing_status."
}
},
"default": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"brokers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"expected_income": {
"type": "number",
"description": "EUR, not cents."
},
"current_fsa": {
"type": "number",
"description": "EUR, not cents."
},
"optimal_fsa": {
"type": "number",
"description": "EUR, not cents."
},
"tax_with_current": {
"type": "number",
"description": "EUR, not cents."
},
"tax_with_optimal": {
"type": "number",
"description": "EUR, not cents."
},
"delta": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"name",
"expected_income",
"current_fsa",
"optimal_fsa",
"tax_with_current",
"tax_with_optimal",
"delta"
],
"additionalProperties": false
}
},
"total_expected_income": {
"type": "number",
"description": "EUR, not cents."
},
"total_fsa_available": {
"type": "number",
"description": "EUR, not cents."
},
"total_fsa_optimal": {
"type": "number",
"description": "EUR, not cents."
},
"total_tax_current": {
"type": "number",
"description": "EUR, not cents."
},
"total_tax_optimal": {
"type": "number",
"description": "EUR, not cents."
},
"savings": {
"type": "number",
"description": "EUR, not cents."
},
"warnings": {
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"over_limit"
]
},
"message": {
"type": "string"
},
"allocated": {
"type": "number",
"description": "EUR, not cents."
},
"allowance": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"type",
"message",
"allocated",
"allowance"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"under_utilised"
]
},
"message": {
"type": "string"
},
"brokerIndex": {
"type": "integer",
"minimum": 0
},
"brokerName": {
"type": "string"
},
"allocated": {
"type": "number",
"description": "EUR, not cents."
},
"expected": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"type",
"message",
"brokerIndex",
"brokerName",
"allocated",
"expected"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"january_risk"
]
},
"message": {
"type": "string"
},
"brokerIndex": {
"type": "integer",
"minimum": 0
},
"brokerName": {
"type": "string"
},
"preTax": {
"type": "number",
"description": "EUR, not cents."
},
"allocated": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"type",
"message",
"brokerIndex",
"brokerName",
"preTax",
"allocated"
],
"additionalProperties": false
}
]
}
}
},
"required": [
"brokers",
"total_expected_income",
"total_fsa_available",
"total_fsa_optimal",
"total_tax_current",
"total_tax_optimal",
"savings",
"warnings"
],
"additionalProperties": false
}Calculate compound growth with starting capital and monthly contributions. Compare assumed-return scenarios before tax. Free to use, not a forecast.
POST /api/v1/public/calculators/etf-sparplan
{
"inputs": {
"initial_investment": 0,
"monthly_rate": 300,
"annual_increase": 2,
"annual_return": 7,
"projection_basis": "historical_us_equity",
"projection_spread": 2,
"years": 20,
"include_tax_drag": false,
"fondstyp": "AKTIENFONDS",
"taxProfile": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"currency": "USD"
},
"locale": "en"
}{
"type": "object",
"properties": {
"initial_investment": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"monthly_rate": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 300,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"annual_increase": {
"type": "number",
"minimum": 0,
"maximum": 10,
"default": 2,
"description": "Annual percentage points: 6 means 6%, not 0.06."
},
"annual_return": {
"type": "number",
"minimum": -99,
"maximum": 50,
"default": 7,
"description": "Custom effective annual return (CAGR), in percentage points. Used only in custom mode. The legacy default is an illustrative assumption, not a market estimate."
},
"projection_basis": {
"type": "string",
"enum": [
"custom",
"historical_us_equity"
],
"default": "custom",
"description": "custom uses caller assumptions. historical_us_equity uses horizon-matched 10th/50th/90th percentiles of overlapping NYU Stern US equity annualized total-return windows, 1928–2025, USD. Historical percentiles are not future probabilities. The dated reference snapshot is not truncated by asOf."
},
"lower_annual_return": {
"type": "number",
"minimum": -99,
"maximum": 50,
"description": "Custom lower effective annual return; otherwise annual_return minus projection_spread."
},
"higher_annual_return": {
"type": "number",
"minimum": -99,
"maximum": 50,
"description": "Custom higher effective annual return; otherwise annual_return plus projection_spread."
},
"projection_spread": {
"type": "number",
"minimum": 0,
"maximum": 10,
"default": 2,
"description": "Custom-mode fallback spread in percentage points, used only when explicit lower_annual_return or higher_annual_return is absent. These are illustrative sensitivity assumptions, not empirically calibrated bounds or probabilities."
},
"years": {
"type": "integer",
"minimum": 1,
"maximum": 40,
"default": 20
},
"include_tax_drag": {
"type": "boolean",
"default": false
},
"fondstyp": {
"type": "string",
"enum": [
"AKTIENFONDS",
"MISCHFONDS",
"SONSTIGE"
],
"default": "AKTIENFONDS"
},
"taxProfile": {
"type": "object",
"properties": {
"bundesland": {
"anyOf": [
{
"type": "string",
"enum": [
"Baden-Württemberg",
"Bayern",
"Berlin",
"Brandenburg",
"Bremen",
"Hamburg",
"Hessen",
"Mecklenburg-Vorpommern",
"Niedersachsen",
"Nordrhein-Westfalen",
"Rheinland-Pfalz",
"Saarland",
"Sachsen",
"Sachsen-Anhalt",
"Schleswig-Holstein",
"Thüringen"
]
},
{
"type": "null"
}
],
"default": null
},
"kirchensteuer": {
"type": "boolean",
"default": false
},
"filing_status": {
"type": "string",
"enum": [
"single",
"joint"
],
"default": "single"
},
"sparerpauschbetrag_remaining": {
"type": "number",
"minimum": 0,
"maximum": 2000,
"default": 1000,
"description": "Remaining EUR allowance for single-year tax calculations. Multi-year projections use the full annual statutory allowance based on filing_status."
}
},
"default": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"additionalProperties": false
},
"currency": {
"type": "string",
"enum": [
"EUR",
"USD",
"GBP",
"CHF",
"PLN",
"CZK"
],
"default": "EUR",
"description": "Unit of every amount in the inputs and the result. The math is the same in every currency; German tax requires EUR."
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"yearly_data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"year": {
"type": "integer",
"minimum": 0,
"description": "Year index from the start of the projection."
},
"contributions_cumulative": {
"type": "number",
"description": "EUR, not cents."
},
"value_before_tax": {
"type": "number",
"description": "EUR, not cents."
},
"value_after_tax": {
"type": "number",
"description": "EUR, not cents."
},
"annual_contribution": {
"type": "number",
"description": "EUR, not cents."
},
"vorabpauschale_tax": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"year",
"contributions_cumulative",
"value_before_tax",
"value_after_tax",
"annual_contribution",
"vorabpauschale_tax"
],
"additionalProperties": false
}
},
"final_value": {
"type": "number",
"description": "EUR, not cents."
},
"total_contributions": {
"type": "number",
"description": "EUR, not cents."
},
"total_growth": {
"type": "number",
"description": "EUR, not cents."
},
"total_taxes_paid": {
"type": "number",
"description": "EUR, not cents."
},
"final_value_no_tax": {
"type": "number",
"description": "EUR, not cents."
},
"tax_drag_eur": {
"type": "number",
"description": "EUR, not cents."
},
"tax_drag_pct": {
"type": "number",
"description": "Percentage points: 4 means 4%."
},
"projection_basis": {
"type": "string",
"enum": [
"custom",
"historical_us_equity"
]
},
"return_reference": {
"type": [
"object",
"null"
],
"properties": {
"sourceUrl": {
"type": "string"
},
"sourceEdition": {
"type": "string"
},
"firstYear": {
"type": "integer"
},
"lastYear": {
"type": "integer"
},
"currency": {
"type": "string",
"enum": [
"USD"
]
},
"horizonYears": {
"type": "integer"
},
"windowCount": {
"type": "integer"
},
"percentiles": {
"type": "array",
"prefixItems": [
{
"type": "number",
"description": "Fraction: 0.25 means 25%."
},
{
"type": "number",
"description": "Fraction: 0.25 means 25%."
},
{
"type": "number",
"description": "Fraction: 0.25 means 25%."
}
]
},
"latestWindowAnnualReturn": {
"type": "number",
"description": "Percentage points: 4 means 4%."
}
},
"required": [
"sourceUrl",
"sourceEdition",
"firstYear",
"lastYear",
"currency",
"horizonYears",
"windowCount",
"percentiles",
"latestWindowAnnualReturn"
],
"additionalProperties": false
},
"projections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"yearly_data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"year": {
"type": "integer",
"minimum": 0,
"description": "Year index from the start of the projection."
},
"contributions_cumulative": {
"type": "number",
"description": "EUR, not cents."
},
"value_before_tax": {
"type": "number",
"description": "EUR, not cents."
},
"value_after_tax": {
"type": "number",
"description": "EUR, not cents."
},
"annual_contribution": {
"type": "number",
"description": "EUR, not cents."
},
"vorabpauschale_tax": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"year",
"contributions_cumulative",
"value_before_tax",
"value_after_tax",
"annual_contribution",
"vorabpauschale_tax"
],
"additionalProperties": false
}
},
"final_value": {
"type": "number",
"description": "EUR, not cents."
},
"total_contributions": {
"type": "number",
"description": "EUR, not cents."
},
"total_growth": {
"type": "number",
"description": "EUR, not cents."
},
"total_taxes_paid": {
"type": "number",
"description": "EUR, not cents."
},
"final_value_no_tax": {
"type": "number",
"description": "EUR, not cents."
},
"tax_drag_eur": {
"type": "number",
"description": "EUR, not cents."
},
"tax_drag_pct": {
"type": "number",
"description": "Percentage points: 4 means 4%."
},
"scenario": {
"type": "string",
"enum": [
"lower",
"central",
"higher"
]
},
"annual_return": {
"type": "number",
"description": "Percentage points: 4 means 4%."
}
},
"required": [
"yearly_data",
"final_value",
"total_contributions",
"total_growth",
"total_taxes_paid",
"final_value_no_tax",
"tax_drag_eur",
"tax_drag_pct",
"scenario",
"annual_return"
],
"additionalProperties": false
},
"description": "Lower, central and higher constant-return scenarios, in that order. Not a probability distribution. Top-level fields retain the central projection."
}
},
"required": [
"yearly_data",
"final_value",
"total_contributions",
"total_growth",
"total_taxes_paid",
"final_value_no_tax",
"tax_drag_eur",
"tax_drag_pct",
"projection_basis",
"return_reference",
"projections"
],
"additionalProperties": false
}How much financial cushion do you need?
POST /api/v1/public/calculators/notgroschen
{
"inputs": {
"monthlyExpenses": 2500,
"bufferMonths": 6,
"currentSavings": 0,
"monthlySavingsCapacity": 300,
"parkingVehicle": "tagesgeld",
"currency": "EUR",
"interestRateMode": "example",
"annualInterestPct": 0
},
"locale": "en"
}{
"type": "object",
"properties": {
"monthlyExpenses": {
"type": "number",
"minimum": 1,
"maximum": 100000000,
"default": 2500,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"bufferMonths": {
"anyOf": [
{
"type": "number",
"enum": [
3
]
},
{
"type": "number",
"enum": [
6
]
},
{
"type": "number",
"enum": [
9
]
},
{
"type": "number",
"enum": [
12
]
}
],
"default": 6
},
"currentSavings": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"monthlySavingsCapacity": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 300,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"parkingVehicle": {
"type": "string",
"enum": [
"tagesgeld",
"geldmarkt_etf",
"festgeld_leiter"
],
"default": "tagesgeld"
},
"currency": {
"type": "string",
"enum": [
"EUR",
"USD",
"GBP",
"CHF",
"PLN",
"CZK"
],
"default": "EUR",
"description": "Unit of every amount in the inputs and the result. The math is the same in every currency; German tax requires EUR."
},
"interestRateMode": {
"type": "string",
"enum": [
"example",
"entered"
],
"default": "example",
"description": "example: the illustrative euro rate of parkingVehicle (EUR only). entered: annualInterestPct."
},
"annualInterestPct": {
"type": "number",
"minimum": 0,
"maximum": 10,
"default": 0,
"description": "The interest the savings earn, percentage points a year; used when interestRateMode is entered."
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"targetAmount": {
"type": "number",
"description": "EUR, not cents."
},
"deficit": {
"type": "number",
"description": "EUR, not cents."
},
"monthsToTarget": {
"type": "integer",
"minimum": 0,
"description": "Months to target, capped at 600. Inspect targetUnreachable; zero with a positive deficit does not mean funded."
},
"targetUnreachable": {
"type": "boolean",
"description": "True when an unfunded target has zero saving capacity or is not reached within the 600-month horizon."
},
"targetDate": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "UTC modeled target date; only meaningful if the target is funded or reachable with positive saving capacity."
},
"expectedReturn": {
"type": "number",
"description": "EUR, not cents."
},
"recommendedVehicle": {
"type": "string",
"enum": [
"tagesgeld",
"geldmarkt_etf",
"festgeld_leiter"
]
}
},
"required": [
"targetAmount",
"deficit",
"monthsToTarget",
"targetUnreachable",
"targetDate",
"expectedReturn",
"recommendedVehicle"
],
"additionalProperties": false
}How much do you need for your property?
POST /api/v1/public/calculators/eigenkapital
{
"inputs": {
"purchasePrice": 350000,
"bundesland": "nordrhein-westfalen",
"eigenkapitalQuote": 20,
"currentSavings": 30000,
"monthlySavingsCapacity": 500,
"savingsReturnPct": 4
},
"locale": "en"
}{
"type": "object",
"properties": {
"purchasePrice": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 350000,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"bundesland": {
"type": "string",
"enum": [
"baden-wuerttemberg",
"bayern",
"berlin",
"brandenburg",
"bremen",
"hamburg",
"hessen",
"mecklenburg-vorpommern",
"niedersachsen",
"nordrhein-westfalen",
"rheinland-pfalz",
"saarland",
"sachsen",
"sachsen-anhalt",
"schleswig-holstein",
"thueringen"
],
"default": "nordrhein-westfalen"
},
"eigenkapitalQuote": {
"type": "number",
"minimum": 10,
"maximum": 40,
"default": 20,
"description": "Equity percentage points, e.g. 20 for 20%."
},
"currentSavings": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 30000,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"monthlySavingsCapacity": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 500,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"savingsReturnPct": {
"type": "number",
"minimum": 0,
"maximum": 8,
"default": 4,
"description": "Annual percentage points: 6 means 6%, not 0.06."
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"nebenkostenTotal": {
"type": "number",
"description": "EUR, not cents."
},
"nebenkostenBreakdown": {
"type": "object",
"properties": {
"grunderwerbsteuer": {
"type": "number",
"description": "EUR, not cents."
},
"notarGrundbuch": {
"type": "number",
"description": "EUR, not cents."
},
"makler": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"grunderwerbsteuer",
"notarGrundbuch",
"makler"
],
"additionalProperties": false
},
"eigenkapitalRequired": {
"type": "number",
"description": "EUR, not cents."
},
"totalUpfront": {
"type": "number",
"description": "EUR, not cents."
},
"deficit": {
"type": "number",
"description": "EUR, not cents."
},
"monthsToTarget": {
"type": "integer",
"minimum": 0,
"description": "Months to target, capped at 600. Inspect targetUnreachable; zero with a positive deficit does not mean funded."
},
"targetUnreachable": {
"type": "boolean",
"description": "True when an unfunded target has zero saving capacity or is not reached within the 600-month horizon."
},
"targetDate": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "UTC modeled target date; only meaningful if the target is funded or reachable with positive saving capacity."
},
"monthlyMortgageEstimate": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"nebenkostenTotal",
"nebenkostenBreakdown",
"eigenkapitalRequired",
"totalUpfront",
"deficit",
"monthsToTarget",
"targetUnreachable",
"targetDate",
"monthlyMortgageEstimate"
],
"additionalProperties": false
}What's missing for your retirement?
POST /api/v1/public/calculators/rentenluecke
{
"inputs": {
"currentAge": 35,
"retirementAge": 67,
"grossMonthlyIncome": 4000,
"workingYearsSoFar": 10,
"desiredRetirementIncome": 2500,
"existingPrivateProvision": 0,
"monthlyContribution": 300,
"annualReturnPct": 6,
"statePensionMode": "estimate",
"statePensionMonthly": 0,
"currency": "EUR",
"taxJurisdiction": "DE",
"ownTaxRatePct": 0
},
"locale": "en"
}{
"type": "object",
"properties": {
"currentAge": {
"type": "integer",
"minimum": 18,
"maximum": 65,
"default": 35
},
"retirementAge": {
"type": "integer",
"minimum": 55,
"maximum": 70,
"default": 67
},
"grossMonthlyIncome": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 4000,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"workingYearsSoFar": {
"type": "integer",
"minimum": 0,
"maximum": 50,
"default": 10
},
"desiredRetirementIncome": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 2500,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"existingPrivateProvision": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"monthlyContribution": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 300,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"annualReturnPct": {
"type": "number",
"minimum": 0,
"maximum": 15,
"default": 6,
"description": "Annual percentage points: 6 means 6%, not 0.06."
},
"statePensionMode": {
"type": "string",
"enum": [
"estimate",
"entered"
],
"default": "estimate",
"description": "estimate: the German statutory pension from grossMonthlyIncome and workingYearsSoFar (EUR only). entered: statePensionMonthly."
},
"statePensionMonthly": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0,
"description": "The reader's own expected state pension per month, after deductions; used when statePensionMode is entered."
},
"currency": {
"type": "string",
"enum": [
"EUR",
"USD",
"GBP",
"CHF",
"PLN",
"CZK"
],
"default": "EUR",
"description": "Unit of every amount in the inputs and the result. The math is the same in every currency; German tax requires EUR."
},
"taxJurisdiction": {
"type": "string",
"enum": [
"DE",
"OTHER"
],
"default": "DE",
"description": "DE applies the German tax model (EUR only). OTHER applies ownTaxRatePct to the gain share, with no German exemption, allowance or advance tax."
},
"ownTaxRatePct": {
"type": "number",
"minimum": 0,
"maximum": 60,
"default": 0,
"description": "Percentage points of tax on investment gains: 15 means 15%. 0 shows the result before tax. Used only with taxJurisdiction OTHER."
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"estimatedStatePension": {
"type": "number",
"description": "Estimated monthly state pension, EUR."
},
"monthlyGap": {
"type": "number",
"description": "EUR, not cents."
},
"annualGap": {
"type": "number",
"description": "EUR, not cents."
},
"capitalNeeded": {
"type": "number",
"description": "EUR, not cents."
},
"capitalNeededAfterExisting": {
"type": "number",
"description": "EUR, not cents."
},
"monthlySavingsNeeded": {
"type": "number",
"description": "EUR, not cents."
},
"surplusOrDeficit": {
"type": "number",
"description": "EUR, not cents."
},
"yearsUntilRetirement": {
"type": "number",
"description": "Elapsed years, possibly fractional."
}
},
"required": [
"estimatedStatePension",
"monthlyGap",
"annualGap",
"capitalNeeded",
"capitalNeededAfterExisting",
"monthlySavingsNeeded",
"surplusOrDeficit",
"yearsUntilRetirement"
],
"additionalProperties": false
}How long will your assets last?
POST /api/v1/public/calculators/entnahmeplan
{
"inputs": {
"portfolioValue": 500000,
"monthlyWithdrawal": 2000,
"annualReturnPct": 5,
"inflationPct": 2,
"strategy": "constant_nominal",
"percentageRate": 4,
"taxProfile": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"currency": "EUR",
"taxJurisdiction": "DE",
"ownTaxRatePct": 0
},
"locale": "en"
}{
"type": "object",
"properties": {
"portfolioValue": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 500000,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"monthlyWithdrawal": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 2000,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"annualReturnPct": {
"type": "number",
"minimum": 0,
"maximum": 15,
"default": 5,
"description": "Annual percentage points: 6 means 6%, not 0.06."
},
"inflationPct": {
"type": "number",
"minimum": 0,
"maximum": 5,
"default": 2,
"description": "Annual percentage points: 6 means 6%, not 0.06."
},
"strategy": {
"type": "string",
"enum": [
"constant_nominal",
"constant_real",
"percentage"
],
"default": "constant_nominal"
},
"percentageRate": {
"type": "number",
"minimum": 0.1,
"maximum": 20,
"default": 4,
"description": "Annual withdrawal percentage points: 4 means 4%."
},
"taxProfile": {
"type": "object",
"properties": {
"bundesland": {
"anyOf": [
{
"type": "string",
"enum": [
"Baden-Württemberg",
"Bayern",
"Berlin",
"Brandenburg",
"Bremen",
"Hamburg",
"Hessen",
"Mecklenburg-Vorpommern",
"Niedersachsen",
"Nordrhein-Westfalen",
"Rheinland-Pfalz",
"Saarland",
"Sachsen",
"Sachsen-Anhalt",
"Schleswig-Holstein",
"Thüringen"
]
},
{
"type": "null"
}
],
"default": null
},
"kirchensteuer": {
"type": "boolean",
"default": false
},
"filing_status": {
"type": "string",
"enum": [
"single",
"joint"
],
"default": "single"
},
"sparerpauschbetrag_remaining": {
"type": "number",
"minimum": 0,
"maximum": 2000,
"default": 1000,
"description": "Remaining EUR allowance for single-year tax calculations. Multi-year projections use the full annual statutory allowance based on filing_status."
}
},
"default": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"additionalProperties": false
},
"currency": {
"type": "string",
"enum": [
"EUR",
"USD",
"GBP",
"CHF",
"PLN",
"CZK"
],
"default": "EUR",
"description": "Unit of every amount in the inputs and the result. The math is the same in every currency; German tax requires EUR."
},
"taxJurisdiction": {
"type": "string",
"enum": [
"DE",
"OTHER"
],
"default": "DE",
"description": "DE applies the German tax model (EUR only). OTHER applies ownTaxRatePct to the gain share, with no German exemption, allowance or advance tax."
},
"ownTaxRatePct": {
"type": "number",
"minimum": 0,
"maximum": 60,
"default": 0,
"description": "Percentage points of tax on investment gains: 15 means 15%. 0 shows the result before tax. Used only with taxJurisdiction OTHER."
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"yearlyData": {
"type": "array",
"items": {
"type": "object",
"properties": {
"year": {
"type": "integer",
"minimum": 0,
"description": "Year index from the start of the projection."
},
"balanceStart": {
"type": "number",
"description": "EUR, not cents."
},
"withdrawal": {
"type": "number",
"description": "EUR, not cents."
},
"grossWithdrawal": {
"type": "number",
"description": "EUR, not cents."
},
"taxPaid": {
"type": "number",
"description": "EUR, not cents."
},
"growth": {
"type": "number",
"description": "EUR, not cents."
},
"balanceEnd": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"year",
"balanceStart",
"withdrawal",
"grossWithdrawal",
"taxPaid",
"growth",
"balanceEnd"
],
"additionalProperties": false
}
},
"yearsUntilDepletion": {
"type": [
"number",
"null"
],
"description": "Null means no depletion within the modeled horizon; it does not show that the withdrawals last for life."
},
"totalWithdrawals": {
"type": "number",
"description": "EUR, not cents."
},
"totalTaxPaid": {
"type": "number",
"description": "EUR, not cents."
},
"effectiveWithdrawalRate": {
"type": "number",
"description": "First simulated gross withdrawal divided by the initial portfolio, in percentage points; zero when no withdrawal is modeled."
},
"remainingAt80": {
"type": [
"number",
"null"
],
"description": "EUR at age 80; null if that age is outside the modeled age/horizon."
},
"remainingAt90": {
"type": [
"number",
"null"
],
"description": "EUR at age 90; null if that age is outside the modeled age/horizon."
}
},
"required": [
"yearlyData",
"yearsUntilDepletion",
"totalWithdrawals",
"totalTaxPaid",
"effectiveWithdrawalRate",
"remainingAt80",
"remainingAt90"
],
"additionalProperties": false
}Calculate tax-free allowances and tax liability
POST /api/v1/public/calculators/schenkungsteuer
{
"inputs": {
"relationship": "child",
"giftAmount": 100000,
"previousGifts10y": 0,
"numberOfDonors": 1,
"optimizeOverTime": false,
"totalToTransfer": 100000
},
"locale": "en"
}{
"type": "object",
"properties": {
"relationship": {
"type": "string",
"enum": [
"spouse",
"child",
"grandchild",
"sibling",
"other"
],
"default": "child"
},
"giftAmount": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 100000,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"previousGifts10y": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0,
"description": "Total prior gifts within ten years, split equally across donors. Credits prior tax computed under current law; a higher actual prior assessment is not modeled."
},
"numberOfDonors": {
"type": "integer",
"minimum": 1,
"maximum": 2,
"default": 1,
"description": "Current and prior gifts are split equally; each donor is taxed separately."
},
"optimizeOverTime": {
"type": "boolean",
"default": false
},
"totalToTransfer": {
"type": "number",
"minimum": 0,
"maximum": 10000000,
"default": 100000,
"description": "Used only when optimizeOverTime is true. Prior gifts are not modeled by optimization."
}
},
"additionalProperties": false
}{
"anyOf": [
{
"type": "object",
"properties": {
"freibetrag": {
"type": "number",
"description": "EUR, not cents."
},
"totalFreibetrag": {
"type": "number",
"description": "EUR, not cents."
},
"taxableAmount": {
"type": "number",
"description": "EUR, not cents."
},
"taxRate": {
"type": "number",
"description": "Fraction: 0.25 means 25%."
},
"taxDue": {
"type": "number",
"description": "EUR, not cents."
},
"netGiftAmount": {
"type": "number",
"description": "EUR, not cents."
},
"steuerklasse": {
"type": "string",
"enum": [
"I",
"II",
"III"
]
},
"optimalSchedule": {
"type": "array",
"items": {
"type": "object",
"properties": {
"year": {
"type": "integer",
"minimum": 0,
"description": "Year index from the start of the projection."
},
"amount": {
"type": "number",
"description": "EUR, not cents."
},
"taxFree": {
"type": "boolean"
},
"taxDue": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"year",
"amount",
"taxFree",
"taxDue"
],
"additionalProperties": false
}
},
"totalTaxSaved": {
"type": "number",
"description": "EUR, not cents."
},
"yearsNeeded": {
"type": "number",
"description": "Elapsed years, possibly fractional."
}
},
"required": [
"freibetrag",
"totalFreibetrag",
"taxableAmount",
"taxRate",
"taxDue",
"netGiftAmount",
"steuerklasse",
"optimalSchedule",
"totalTaxSaved",
"yearsNeeded"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"freibetrag": {
"type": "number",
"description": "EUR, not cents."
},
"totalFreibetrag": {
"type": "number",
"description": "EUR, not cents."
},
"taxableAmount": {
"type": "number",
"description": "EUR, not cents."
},
"taxRate": {
"type": "number",
"description": "Fraction: 0.25 means 25%."
},
"taxDue": {
"type": "number",
"description": "EUR, not cents."
},
"netGiftAmount": {
"type": "number",
"description": "EUR, not cents."
},
"steuerklasse": {
"type": "string",
"enum": [
"I",
"II",
"III"
]
}
},
"required": [
"freibetrag",
"totalFreibetrag",
"taxableAmount",
"taxRate",
"taxDue",
"netGiftAmount",
"steuerklasse"
],
"additionalProperties": false
}
],
"description": "Scheduling mode adds optimalSchedule, totalTaxSaved and yearsNeeded. Single-gift mode returns the base fields."
}What will your child's savings plan grow to?
POST /api/v1/public/calculators/junior-depot
{
"inputs": {
"childAge": 0,
"targetAge": 18,
"monthlyContribution": 100,
"initialDeposit": 0,
"annualReturnPct": 7,
"useKindergeld": false,
"hasNVBescheinigung": false,
"taxProfile": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
}
},
"locale": "en"
}{
"type": "object",
"properties": {
"childAge": {
"type": "integer",
"minimum": 0,
"maximum": 17,
"default": 0
},
"targetAge": {
"type": "integer",
"minimum": 1,
"maximum": 30,
"default": 18
},
"monthlyContribution": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 100,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"initialDeposit": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"annualReturnPct": {
"type": "number",
"minimum": 0,
"maximum": 15,
"default": 7,
"description": "Annual percentage points: 6 means 6%, not 0.06."
},
"useKindergeld": {
"type": "boolean",
"default": false
},
"hasNVBescheinigung": {
"type": "boolean",
"default": false
},
"taxProfile": {
"type": "object",
"properties": {
"bundesland": {
"anyOf": [
{
"type": "string",
"enum": [
"Baden-Württemberg",
"Bayern",
"Berlin",
"Brandenburg",
"Bremen",
"Hamburg",
"Hessen",
"Mecklenburg-Vorpommern",
"Niedersachsen",
"Nordrhein-Westfalen",
"Rheinland-Pfalz",
"Saarland",
"Sachsen",
"Sachsen-Anhalt",
"Schleswig-Holstein",
"Thüringen"
]
},
{
"type": "null"
}
],
"default": null
},
"kirchensteuer": {
"type": "boolean",
"default": false
},
"filing_status": {
"type": "string",
"enum": [
"single",
"joint"
],
"default": "single"
},
"sparerpauschbetrag_remaining": {
"type": "number",
"minimum": 0,
"maximum": 2000,
"default": 1000,
"description": "Remaining EUR allowance for single-year tax calculations. Multi-year projections use the full annual statutory allowance based on filing_status."
}
},
"default": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"yearlyData": {
"type": "array",
"items": {
"type": "object",
"properties": {
"year": {
"type": "integer",
"minimum": 0,
"description": "Year index from the start of the projection."
},
"age": {
"type": "integer",
"description": "Child age in years."
},
"contributionsCumulative": {
"type": "number",
"description": "EUR, not cents."
},
"valueGross": {
"type": "number",
"description": "EUR, not cents."
},
"vorabpauschaleTax": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"year",
"age",
"contributionsCumulative",
"valueGross",
"vorabpauschaleTax"
],
"additionalProperties": false
}
},
"finalValueGross": {
"type": "number",
"description": "EUR, not cents."
},
"totalContributions": {
"type": "number",
"description": "EUR, not cents."
},
"totalGrowth": {
"type": "number",
"description": "EUR, not cents."
},
"finalValueAfterTax": {
"type": "number",
"description": "EUR, not cents."
},
"taxOnSale": {
"type": "number",
"description": "EUR, not cents."
},
"vorabpauschaleCredited": {
"type": "number",
"description": "EUR, not cents."
},
"nvSavings": {
"type": "number",
"description": "EUR, not cents."
},
"kindergeldEquivalent": {
"type": "string",
"description": "Language-neutral contribution × 12 × years expression; use numeric result fields for arithmetic."
}
},
"required": [
"yearlyData",
"finalValueGross",
"totalContributions",
"totalGrowth",
"finalValueAfterTax",
"taxOnSale",
"vorabpauschaleCredited",
"nvSavings",
"kindergeldEquivalent"
],
"additionalProperties": false
}When will you reach financial independence?
POST /api/v1/public/calculators/fire-rechner
{
"inputs": {
"monthlyExpenses": 2000,
"currentPortfolio": 100000,
"monthlyContribution": 1500,
"annualReturnPct": 7,
"withdrawalRatePct": 3.5,
"currentAge": 30,
"partTimeIncome": 1000,
"targetRetirementAge": 55,
"variant": "regular",
"taxProfile": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"currency": "EUR",
"taxJurisdiction": "DE",
"ownTaxRatePct": 0
},
"locale": "en"
}{
"type": "object",
"properties": {
"monthlyExpenses": {
"type": "number",
"minimum": 1,
"maximum": 100000000,
"default": 2000,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"currentPortfolio": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 100000,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"monthlyContribution": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 1500,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"annualReturnPct": {
"type": "number",
"minimum": 0,
"maximum": 15,
"default": 7,
"description": "Annual percentage points: 6 means 6%, not 0.06."
},
"withdrawalRatePct": {
"type": "number",
"minimum": 2,
"maximum": 6,
"default": 3.5
},
"currentAge": {
"type": "integer",
"minimum": 18,
"maximum": 70,
"default": 30
},
"partTimeIncome": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 1000,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"targetRetirementAge": {
"type": "integer",
"minimum": 19,
"maximum": 80,
"default": 55
},
"variant": {
"type": "string",
"enum": [
"regular",
"coast",
"barista"
],
"default": "regular"
},
"taxProfile": {
"type": "object",
"properties": {
"bundesland": {
"anyOf": [
{
"type": "string",
"enum": [
"Baden-Württemberg",
"Bayern",
"Berlin",
"Brandenburg",
"Bremen",
"Hamburg",
"Hessen",
"Mecklenburg-Vorpommern",
"Niedersachsen",
"Nordrhein-Westfalen",
"Rheinland-Pfalz",
"Saarland",
"Sachsen",
"Sachsen-Anhalt",
"Schleswig-Holstein",
"Thüringen"
]
},
{
"type": "null"
}
],
"default": null
},
"kirchensteuer": {
"type": "boolean",
"default": false
},
"filing_status": {
"type": "string",
"enum": [
"single",
"joint"
],
"default": "single"
},
"sparerpauschbetrag_remaining": {
"type": "number",
"minimum": 0,
"maximum": 2000,
"default": 1000,
"description": "Remaining EUR allowance for single-year tax calculations. Multi-year projections use the full annual statutory allowance based on filing_status."
}
},
"default": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"additionalProperties": false
},
"currency": {
"type": "string",
"enum": [
"EUR",
"USD",
"GBP",
"CHF",
"PLN",
"CZK"
],
"default": "EUR",
"description": "Unit of every amount in the inputs and the result. The math is the same in every currency; German tax requires EUR."
},
"taxJurisdiction": {
"type": "string",
"enum": [
"DE",
"OTHER"
],
"default": "DE",
"description": "DE applies the German tax model (EUR only). OTHER applies ownTaxRatePct to the gain share, with no German exemption, allowance or advance tax."
},
"ownTaxRatePct": {
"type": "number",
"minimum": 0,
"maximum": 60,
"default": 0,
"description": "Percentage points of tax on investment gains: 15 means 15%. 0 shows the result before tax. Used only with taxJurisdiction OTHER."
}
},
"additionalProperties": false,
"description": "Coast FIRE requires a future target age and a nominal return above 2% (the model inflation assumption)."
}{
"type": "object",
"properties": {
"fireNumber": {
"type": "number",
"description": "EUR, not cents."
},
"fireNumberPreTax": {
"type": "number",
"description": "EUR, not cents."
},
"yearsToFire": {
"type": [
"number",
"null"
],
"description": "Null means the target was not reached within the 50-year modeled horizon."
},
"monthlyContributionNeeded": {
"type": [
"number",
"null"
],
"description": "Null unless an independent target retirement age is supplied."
},
"coastFireNumber": {
"type": [
"number",
"null"
],
"description": "Null when Coast FIRE does not apply."
},
"coastFireAge": {
"type": [
"number",
"null"
],
"description": "Absolute age in years; null when Coast FIRE age is not applicable, including an already-funded portfolio."
},
"baristaIncomeNeeded": {
"type": [
"number",
"null"
],
"description": "Annual part-time income in EUR; null when the Barista calculation does not apply."
},
"baristaPortfolioNeeded": {
"type": [
"number",
"null"
],
"description": "Null when the Barista calculation does not apply."
},
"effectiveMultiplier": {
"type": "number",
"description": "Multiple of annual expenses, not a percentage or EUR amount."
}
},
"required": [
"fireNumber",
"fireNumberPreTax",
"yearsToFire",
"monthlyContributionNeeded",
"coastFireNumber",
"coastFireAge",
"baristaIncomeNeeded",
"baristaPortfolioNeeded",
"effectiveMultiplier"
],
"additionalProperties": false
}What ongoing costs take from your wealth over the years.
POST /api/v1/public/calculators/fondskosten
{
"inputs": {
"initialAmount": 10000,
"monthlyContribution": 300,
"years": 20,
"annualReturnPct": 7,
"annualCostPct": 1.5,
"comparisonCostPct": 0.2,
"currency": "EUR"
},
"locale": "en"
}{
"type": "object",
"properties": {
"initialAmount": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 10000,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"monthlyContribution": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 300,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"years": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 20
},
"annualReturnPct": {
"type": "number",
"minimum": 0,
"maximum": 15,
"default": 7,
"description": "Yearly return before costs, percentage points: 7 means 7%."
},
"annualCostPct": {
"type": "number",
"minimum": 0,
"maximum": 5,
"default": 1.5,
"description": "Your yearly cost rate, percentage points, 0 to 5."
},
"comparisonCostPct": {
"type": "number",
"minimum": 0,
"maximum": 5,
"default": 0.2,
"description": "The cost rate to compare against, percentage points, 0 to 5."
},
"currency": {
"type": "string",
"enum": [
"EUR",
"USD",
"GBP",
"CHF",
"PLN",
"CZK"
],
"default": "EUR",
"description": "Unit of every amount in the inputs and the result. The math is the same in every currency; German tax requires EUR."
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"yours": {
"type": "object",
"properties": {
"finalValue": {
"type": "number",
"description": "In the inputs' currency, not cents."
},
"contributions": {
"type": "number",
"description": "Initial amount plus every monthly contribution."
},
"feesPaid": {
"type": "number",
"description": "In the inputs' currency, not cents."
},
"yearly": {
"type": "array",
"items": {
"type": "object",
"properties": {
"year": {
"type": "integer",
"minimum": 0,
"description": "Year index from the start of the projection."
},
"value": {
"type": "number",
"description": "In the inputs' currency, not cents."
}
},
"required": [
"year",
"value"
],
"additionalProperties": false
},
"description": "Year 0 (the initial amount) to the final year."
}
},
"required": [
"finalValue",
"contributions",
"feesPaid",
"yearly"
],
"additionalProperties": false
},
"comparison": {
"type": "object",
"properties": {
"finalValue": {
"type": "number",
"description": "In the inputs' currency, not cents."
},
"contributions": {
"type": "number",
"description": "Initial amount plus every monthly contribution."
},
"feesPaid": {
"type": "number",
"description": "In the inputs' currency, not cents."
},
"yearly": {
"type": "array",
"items": {
"type": "object",
"properties": {
"year": {
"type": "integer",
"minimum": 0,
"description": "Year index from the start of the projection."
},
"value": {
"type": "number",
"description": "In the inputs' currency, not cents."
}
},
"required": [
"year",
"value"
],
"additionalProperties": false
},
"description": "Year 0 (the initial amount) to the final year."
}
},
"required": [
"finalValue",
"contributions",
"feesPaid",
"yearly"
],
"additionalProperties": false
},
"difference": {
"type": "number",
"description": "comparison.finalValue - yours.finalValue: positive when your cost rate is the higher one."
},
"shareOfFinalValue": {
"type": "number",
"description": "The difference as a share of the larger final value: 0.152 means 15.2%."
}
},
"required": [
"yours",
"comparison",
"difference",
"shareOfFinalValue"
],
"additionalProperties": false
}How large a gain makes up a loss?
POST /api/v1/public/calculators/verlust-aufholen
{
"inputs": {
"lossPct": 30,
"portfolioValue": 0,
"annualReturnPct": 7,
"currency": "EUR"
},
"locale": "en"
}{
"type": "object",
"properties": {
"lossPct": {
"type": "number",
"exclusiveMinimum": 0,
"exclusiveMaximum": 100,
"default": 30,
"description": "The fall, percentage points above 0 and below 100: 30 means 30%."
},
"portfolioValue": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0,
"description": "The value before the fall; 0 leaves valueAfterLoss and amountToRecover out (null)."
},
"annualReturnPct": {
"type": "number",
"minimum": 0,
"maximum": 15,
"default": 7,
"description": "Steady yearly return for the recovery time, percentage points; 0 leaves yearsToRecover out (null)."
},
"currency": {
"type": "string",
"enum": [
"EUR",
"USD",
"GBP",
"CHF",
"PLN",
"CZK"
],
"default": "EUR",
"description": "Unit of every amount in the inputs and the result. The math is the same in every currency; German tax requires EUR."
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"requiredGainPct": {
"type": "number",
"description": "Percentage points: 4 means 4%."
},
"yearsToRecover": {
"type": [
"number",
"null"
],
"description": "Null when annualReturnPct is 0."
},
"valueAfterLoss": {
"type": [
"number",
"null"
],
"description": "Null when portfolioValue is 0."
},
"amountToRecover": {
"type": [
"number",
"null"
],
"description": "Null when portfolioValue is 0."
},
"table": {
"type": "array",
"items": {
"type": "object",
"properties": {
"lossPct": {
"type": "number",
"description": "Percentage points: 4 means 4%."
},
"requiredGainPct": {
"type": "number",
"description": "Percentage points: 4 means 4%."
}
},
"required": [
"lossPct",
"requiredGainPct"
],
"additionalProperties": false
},
"description": "The common falls 10, 20, 30, 40, 50 and 60%."
}
},
"required": [
"requiredGainPct",
"yearsToRecover",
"valueAfterLoss",
"amountToRecover",
"table"
],
"additionalProperties": false
}Calculate trades towards target weights, or allocate new contributions without selling. Compare the resulting portfolio mix. Tax and fees are excluded.
POST /api/v1/public/calculators/rebalancing
{
"inputs": {
"rows": [
{
"assetClass": "equities",
"currentValue": 70000,
"targetPct": 60
},
{
"assetClass": "bonds",
"currentValue": 20000,
"targetPct": 30
},
{
"assetClass": "cash",
"currentValue": 10000,
"targetPct": 10
}
],
"mode": "buy_and_sell",
"newMoney": 10000,
"currency": "EUR"
},
"locale": "en"
}{
"type": "object",
"properties": {
"rows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"equities",
"bonds",
"crypto",
"alternatives",
"gold",
"cash",
"real_estate",
"commodities"
]
},
"currentValue": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"description": "Current value of the asset class, in the inputs' currency."
},
"targetPct": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Target weight, percentage points: 60 means 60%."
}
},
"required": [
"assetClass",
"currentValue",
"targetPct"
],
"additionalProperties": false
},
"minItems": 1,
"maxItems": 8,
"default": [
{
"assetClass": "equities",
"currentValue": 70000,
"targetPct": 60
},
{
"assetClass": "bonds",
"currentValue": 20000,
"targetPct": 30
},
{
"assetClass": "cash",
"currentValue": 10000,
"targetPct": 10
}
],
"description": "One row per asset class, each class once; the targetPct values add up to 100."
},
"mode": {
"type": "string",
"enum": [
"buy_and_sell",
"new_money"
],
"default": "buy_and_sell",
"description": "buy_and_sell: buys and sells back to the targets. new_money: newMoney only, no sells."
},
"newMoney": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 10000,
"description": "Money to add; used only when mode is new_money."
},
"currency": {
"type": "string",
"enum": [
"EUR",
"USD",
"GBP",
"CHF",
"PLN",
"CZK"
],
"default": "EUR",
"description": "Unit of every amount in the inputs and the result. The math is the same in every currency; German tax requires EUR."
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"total": {
"type": "number",
"description": "The current total, before any new money."
},
"rows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"equities",
"bonds",
"crypto",
"alternatives",
"gold",
"cash",
"real_estate",
"commodities"
]
},
"currentValue": {
"type": "number",
"description": "In the inputs' currency, not cents."
},
"targetPct": {
"type": "number",
"description": "Percentage points: 4 means 4%."
},
"currentPct": {
"type": "number",
"description": "Percentage points: 4 means 4%."
},
"change": {
"type": "number",
"description": "Positive buys, negative sells."
},
"afterValue": {
"type": "number",
"description": "In the inputs' currency, not cents."
},
"afterPct": {
"type": "number",
"description": "Percentage points: 4 means 4%."
}
},
"required": [
"assetClass",
"currentValue",
"targetPct",
"currentPct",
"change",
"afterValue",
"afterPct"
],
"additionalProperties": false
}
},
"totalToMove": {
"type": "number",
"description": "Sum of the buys."
}
},
"required": [
"total",
"rows",
"totalToMove"
],
"additionalProperties": false
}How much capital does your dividend income goal need?
POST /api/v1/public/calculators/dividenden-einkommen
{
"inputs": {
"monthlyNetIncome": 1000,
"dividendYieldPct": 3,
"source": "equity_funds",
"taxProfile": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"currency": "EUR",
"taxJurisdiction": "DE",
"ownTaxRatePct": 0
},
"locale": "en"
}{
"type": "object",
"properties": {
"monthlyNetIncome": {
"type": "number",
"minimum": 1,
"maximum": 100000000,
"default": 1000,
"description": "The income wanted each month, after tax."
},
"dividendYieldPct": {
"type": "number",
"minimum": 0.1,
"maximum": 15,
"default": 3,
"description": "Yearly dividend yield, percentage points: 3 means 3%."
},
"source": {
"type": "string",
"enum": [
"equity_funds",
"shares"
],
"default": "equity_funds",
"description": "German model only: equity_funds get the 30% partial exemption, shares none."
},
"taxProfile": {
"type": "object",
"properties": {
"bundesland": {
"anyOf": [
{
"type": "string",
"enum": [
"Baden-Württemberg",
"Bayern",
"Berlin",
"Brandenburg",
"Bremen",
"Hamburg",
"Hessen",
"Mecklenburg-Vorpommern",
"Niedersachsen",
"Nordrhein-Westfalen",
"Rheinland-Pfalz",
"Saarland",
"Sachsen",
"Sachsen-Anhalt",
"Schleswig-Holstein",
"Thüringen"
]
},
{
"type": "null"
}
],
"default": null
},
"kirchensteuer": {
"type": "boolean",
"default": false
},
"filing_status": {
"type": "string",
"enum": [
"single",
"joint"
],
"default": "single"
},
"sparerpauschbetrag_remaining": {
"type": "number",
"minimum": 0,
"maximum": 2000,
"default": 1000,
"description": "Remaining EUR allowance for single-year tax calculations. Multi-year projections use the full annual statutory allowance based on filing_status."
}
},
"default": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"additionalProperties": false
},
"currency": {
"type": "string",
"enum": [
"EUR",
"USD",
"GBP",
"CHF",
"PLN",
"CZK"
],
"default": "EUR",
"description": "Unit of every amount in the inputs and the result. The math is the same in every currency; German tax requires EUR."
},
"taxJurisdiction": {
"type": "string",
"enum": [
"DE",
"OTHER"
],
"default": "DE",
"description": "DE applies the German tax model (EUR only). OTHER applies ownTaxRatePct to the gain share, with no German exemption, allowance or advance tax."
},
"ownTaxRatePct": {
"type": "number",
"minimum": 0,
"maximum": 60,
"default": 0,
"description": "Percentage points of tax on investment gains: 15 means 15%. 0 shows the result before tax. Used only with taxJurisdiction OTHER."
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"capitalNeeded": {
"type": "number",
"description": "In the inputs' currency, not cents."
},
"annualGross": {
"type": "number",
"description": "In the inputs' currency, not cents."
},
"annualTax": {
"type": "number",
"description": "In the inputs' currency, not cents."
},
"annualNet": {
"type": "number",
"description": "In the inputs' currency, not cents."
},
"monthlyGross": {
"type": "number",
"description": "In the inputs' currency, not cents."
},
"monthlyNet": {
"type": "number",
"description": "In the inputs' currency, not cents."
},
"effectiveTaxRatePct": {
"type": "number",
"description": "Percentage points: 4 means 4%."
}
},
"required": [
"capitalNeeded",
"annualGross",
"annualTax",
"annualNet",
"monthlyGross",
"monthlyNet",
"effectiveTaxRatePct"
],
"additionalProperties": false
}Analyze a portfolio without an Investboard account. Submit ISINs and weights or market values. One request returns overlap, underlying companies, concentration, sectors, geography, currencies, allocation and ongoing fund costs. Separate endpoints add cost projections, industries/themes, revenue geography, before/after comparisons, contribution budgets, ETF alternatives, crisis scenarios and historical replay.
curl 'https://investboard.com/api/v1/public/portfolio-analysis' \
-H 'Content-Type: application/json' \
--data '{
"basis": "weights",
"baseCurrency": "EUR",
"holdings": [
{
"isin": "IE00B4L5Y983",
"weight": 0.6
},
{
"isin": "IE00B3XXRP09",
"weight": 0.3
},
{
"assetClass": "cash",
"currency": "EUR",
"weight": 0.1
}
],
"locale": "en"
}'Use basis: weights with positive fractions summing to 1, or basis: values with positive market values already converted to baseCurrency. Do not mix weights and values or native currencies. Repeated ISINs are pooled across brokers. Cash uses assetClass: cash and a currency. Snapshot and stress requests with weights return null monetary results. Historical replay uses its explicit hypothetical investment amounts.
{
"basis": "values",
"baseCurrency": "EUR",
"holdings": [
{
"isin": "IE00B4L5Y983",
"value": 6000
},
{
"isin": "IE00B3XXRP09",
"value": 3000
},
{
"assetClass": "cash",
"currency": "EUR",
"value": 1000
}
],
"locale": "en"
}Use each endpoint’s own example and schema below. Cost drag requires explicit return and fee assumptions. Revenue geography examines up to 25 underlying companies and retains uncovered weight. Comparisons with incomplete sections suppress their deltas. Contribution planning requires portfolio values and your own targets; unallocated money stays cash.
Every section contains status, reasons and data. HTTP 200 can contain partial or unavailable sections. The eight snapshot endpoints mark the other sections not_requested. The standalone endpoints have their own input schema and return capability plus analysis; inspect analysis.status. Unknown holdings remain in allocation as unknown and in the portfolio denominator. Underlying equity sections describe the resolved population; concentration is withheld when any holding is unresolved.
Allocation covers the submitted portfolio. Look-through, sectors, countries, regions and underlying currency exposure cover equities. Bucket weights refer to the whole submitted portfolio; portfolioShare names the equity population and coverage its classified share. Company concentration weights refer to the equity portfolio, aggregated by issuer. Bonds, cash, gold and crypto funds stay whole in asset allocation.
Underlying currency exposure is modeled from company countries and currency hedges named by funds. It is separate from heldCurrencies, which describes resolved listing currencies and cash. This is not revenue-currency exposure or measured FX sensitivity.
Costs cover ongoing fund charges. weightedTer applies to covered funds, not the whole portfolio. knownAnnualCost is a known subtotal when coverage is incomplete. Missing or zero provider TER is unknown. Brokerage fees, spreads and taxes are excluded.
Constituent dates and coverage accompany the results. Missing data stays unknown. An empty overlap list with incomplete fund holdings does not prove no overlap; pairs below 1% are omitted. HHI, effective issuer count and named issuers are withheld below 80% issuer coverage. Returned holdings and companies are bounded by limit; tailWeight retains the omitted share.
ETF alternatives compare at most ten candidates, from your ISIN list or the shared catalog. Stress scenarios use approximate crisis proxies with published sources. Historical replay simulates your current mix using dated prices and FX; it withholds results if any holding lacks history, and discloses dividend basis and interest-free cash. Contributions begin on day zero. These are comparisons and simulations, not investment recommendations or actual account performance.
Up to 25 submitted holdings per snapshot and 16 KiB per request. A separate shared allowance of 60 units per IP per minute applies to portfolio analysis: one per submitted holding (both snapshots for compare), plus 25 reserved company units for revenue-geography. Historical replay costs two per holding; ETF alternatives cost two per source/candidate, reserving ten candidates for catalog reads. cost-drag and discovery cost one. Limiting is best-effort during outages. Honor Retry-After on HTTP 429. Cross-origin clients use credentials: omit.
Send holdings in POST bodies. No submitted portfolio or analysis result is saved; shared reference-data caches may be populated. Returned documentation links contain no holdings. Usage events contain only operation, known capability, status, duration and holding count.
{
"anyOf": [
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"weights"
],
"default": "weights"
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"isin",
"weight"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"assetClass",
"currency",
"weight"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"holdings"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"values"
]
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"isin",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"assetClass",
"currency",
"value"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"basis",
"holdings"
],
"additionalProperties": false
}
]
}{
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"basis": {
"type": "string",
"enum": [
"weights",
"values"
]
},
"totalValue": {
"type": [
"number",
"null"
],
"minimum": 0
},
"resolvedPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"constituentsAsOf": {
"type": [
"string",
"null"
],
"description": "Oldest known fund-constituent date; null when unavailable. Not the date of all reference data."
},
"holdings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0
},
"assetClass": {
"type": [
"string",
"null"
]
},
"status": {
"type": "string",
"enum": [
"resolved",
"unresolved"
]
}
},
"required": [
"isin",
"name",
"weight",
"value",
"assetClass",
"status"
],
"additionalProperties": false
}
},
"analyses": {
"type": "object",
"properties": {
"allocation": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"whole_portfolio"
]
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"overlap": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"method": {
"type": "string",
"enum": [
"sum_minimum_constituent_weights"
]
},
"fundCount": {
"type": "integer",
"minimum": 0
},
"pairs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fundA": {
"type": "string"
},
"fundB": {
"type": "string"
},
"isinA": {
"type": [
"string",
"null"
]
},
"isinB": {
"type": [
"string",
"null"
]
},
"overlap": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Sum of the smaller constituent weights in the two funds, not a percentage of the portfolio."
},
"sharedCount": {
"type": "integer",
"minimum": 0
},
"sharedTail": {
"type": [
"object",
"null"
],
"properties": {
"count": {
"type": "integer",
"minimum": 0
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"count",
"weight"
],
"additionalProperties": false,
"description": "Shared constituents beyond the returned list; weight uses the same overlap measure as the headline."
},
"sharedHoldings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"weightInA": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"weightInB": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"id",
"name",
"weightInA",
"weightInB"
],
"additionalProperties": false
}
}
},
"required": [
"fundA",
"fundB",
"isinA",
"isinB",
"overlap",
"sharedCount",
"sharedTail",
"sharedHoldings"
],
"additionalProperties": false
}
},
"funds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"full",
"partial",
"none"
]
},
"coveredWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"asOf": {
"type": [
"string",
"null"
]
}
},
"required": [
"isin",
"name",
"status",
"coveredWeight",
"asOf"
],
"additionalProperties": false
}
}
},
"required": [
"method",
"fundCount",
"pairs",
"funds"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"look-through": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"positions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0
},
"sector": {
"type": [
"string",
"null"
]
},
"region": {
"type": [
"string",
"null"
]
},
"provenance": {
"type": "object",
"properties": {
"direct": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"viaFunds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fund": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"shareInFund": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"fund",
"weight",
"shareInFund"
],
"additionalProperties": false
}
}
},
"required": [
"direct",
"viaFunds"
],
"additionalProperties": false
}
},
"required": [
"id",
"isin",
"name",
"weight",
"value",
"sector",
"region",
"provenance"
],
"additionalProperties": false
}
},
"positionCount": {
"type": "integer",
"minimum": 0
},
"unresolvedFundWeight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Whole-portfolio share in undissolved equity fund remainders; these are not named companies."
},
"tailWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"funds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"full",
"partial",
"none"
]
},
"coveredWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"asOf": {
"type": [
"string",
"null"
]
}
},
"required": [
"isin",
"name",
"status",
"coveredWeight",
"asOf"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"positions",
"positionCount",
"unresolvedFundWeight",
"tailWeight",
"funds"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"concentration": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"issuers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"issuerId": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"issuerId",
"name",
"weight"
],
"additionalProperties": false
}
},
"issuerCount": {
"type": [
"integer",
"null"
],
"minimum": 0
},
"tailWeight": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"largestIssuer": {
"type": [
"object",
"null"
],
"properties": {
"issuerId": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"issuerId",
"name",
"weight"
],
"additionalProperties": false
},
"hhi": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1,
"description": "Herfindahl index over the equity issuer book; withheld below 80% coverage."
},
"effectiveN": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Effective issuer count; withheld below 80% coverage."
}
},
"required": [
"scope",
"coverage",
"issuers",
"issuerCount",
"tailWeight",
"largestIssuer",
"hhi",
"effectiveN"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"sectors": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"geography": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"countries": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
},
"regions": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"countries",
"regions"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"currencies": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"equityExposure": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
},
"qualification": {
"type": "object",
"properties": {
"basis": {
"type": "string",
"enum": [
"caller_supplied_listing_denomination",
"country_proxy_with_name_hedge_assumption"
]
},
"methodologyVersion": {
"type": "string",
"enum": [
"listing-denomination-v1",
"country-name-currency-proxy-v1"
]
},
"independentlyVerified": {
"type": "boolean",
"enum": [
false
]
},
"hedgePolicy": {
"type": "string",
"enum": [
"not_verified"
]
},
"stressUse": {
"type": "string",
"enum": [
"ineligible"
]
},
"weightBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio"
]
},
"coverageBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio",
"valued_equity_value"
]
},
"hedgeRatio": {
"type": "null"
}
},
"required": [
"basis",
"methodologyVersion",
"independentlyVerified",
"hedgePolicy",
"stressUse",
"weightBasis",
"coverageBasis",
"hedgeRatio"
],
"additionalProperties": false
},
"listingQualification": {
"type": "object",
"properties": {
"basis": {
"type": "string",
"enum": [
"caller_supplied_listing_denomination",
"country_proxy_with_name_hedge_assumption"
]
},
"methodologyVersion": {
"type": "string",
"enum": [
"listing-denomination-v1",
"country-name-currency-proxy-v1"
]
},
"independentlyVerified": {
"type": "boolean",
"enum": [
false
]
},
"hedgePolicy": {
"type": "string",
"enum": [
"not_verified"
]
},
"stressUse": {
"type": "string",
"enum": [
"ineligible"
]
},
"weightBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio"
]
},
"coverageBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio",
"valued_equity_value"
]
},
"hedgeRatio": {
"type": "null"
}
},
"required": [
"basis",
"methodologyVersion",
"independentlyVerified",
"hedgePolicy",
"stressUse",
"weightBasis",
"coverageBasis",
"hedgeRatio"
],
"additionalProperties": false
},
"heldCurrencies": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
},
"description": "Resolved listing currencies and caller-stated cash currencies; separate from underlying exposure."
},
"hedgedFunds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"currency": {
"type": [
"string",
"null"
]
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"isin",
"name",
"currency",
"weight"
],
"additionalProperties": false
}
}
},
"required": [
"equityExposure",
"qualification",
"listingQualification",
"heldCurrencies",
"hedgedFunds"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"costs": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"ongoing_fund_charges"
]
},
"coveredPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"fundPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"unknownPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"weightedTer": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "TER fraction on the covered fund portion, not on the entire portfolio. 0.002 means 0.2%."
},
"knownAnnualCost": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Known fund charges in baseCurrency; a subtotal when coverage is incomplete. Null for weight-only input."
},
"positions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"ter": {
"type": [
"number",
"null"
],
"minimum": 0
},
"annualCost": {
"type": [
"number",
"null"
],
"minimum": 0
}
},
"required": [
"isin",
"name",
"weight",
"ter",
"annualCost"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"coveredPortfolioWeight",
"fundPortfolioWeight",
"unknownPortfolioWeight",
"weightedTer",
"knownAnnualCost",
"positions"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
}
},
"required": [
"allocation",
"overlap",
"look-through",
"concentration",
"sectors",
"geography",
"currencies",
"costs"
],
"additionalProperties": false
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"limitations": {
"type": "array",
"items": {
"type": "string"
}
},
"links": {
"type": "object",
"properties": {
"documentation": {
"type": "string",
"format": "uri"
},
"catalog": {
"type": "string",
"format": "uri"
}
},
"required": [
"documentation",
"catalog"
],
"additionalProperties": false
}
},
"required": [
"modelVersion",
"computedAt",
"baseCurrency",
"basis",
"totalValue",
"resolvedPortfolioWeight",
"constituentsAsOf",
"holdings",
"analyses",
"assumptions",
"limitations",
"links"
],
"additionalProperties": false
}POST /api/v1/public/portfolio-analysis/allocation
Calculation and limitations →{
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"whole_portfolio"
]
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"coverage",
"buckets"
],
"additionalProperties": false
}POST /api/v1/public/portfolio-analysis/overlap
Calculation and limitations →{
"type": "object",
"properties": {
"method": {
"type": "string",
"enum": [
"sum_minimum_constituent_weights"
]
},
"fundCount": {
"type": "integer",
"minimum": 0
},
"pairs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fundA": {
"type": "string"
},
"fundB": {
"type": "string"
},
"isinA": {
"type": [
"string",
"null"
]
},
"isinB": {
"type": [
"string",
"null"
]
},
"overlap": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Sum of the smaller constituent weights in the two funds, not a percentage of the portfolio."
},
"sharedCount": {
"type": "integer",
"minimum": 0
},
"sharedTail": {
"type": [
"object",
"null"
],
"properties": {
"count": {
"type": "integer",
"minimum": 0
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"count",
"weight"
],
"additionalProperties": false,
"description": "Shared constituents beyond the returned list; weight uses the same overlap measure as the headline."
},
"sharedHoldings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"weightInA": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"weightInB": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"id",
"name",
"weightInA",
"weightInB"
],
"additionalProperties": false
}
}
},
"required": [
"fundA",
"fundB",
"isinA",
"isinB",
"overlap",
"sharedCount",
"sharedTail",
"sharedHoldings"
],
"additionalProperties": false
}
},
"funds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"full",
"partial",
"none"
]
},
"coveredWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"asOf": {
"type": [
"string",
"null"
]
}
},
"required": [
"isin",
"name",
"status",
"coveredWeight",
"asOf"
],
"additionalProperties": false
}
}
},
"required": [
"method",
"fundCount",
"pairs",
"funds"
],
"additionalProperties": false
}POST /api/v1/public/portfolio-analysis/look-through
Calculation and limitations →{
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"positions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0
},
"sector": {
"type": [
"string",
"null"
]
},
"region": {
"type": [
"string",
"null"
]
},
"provenance": {
"type": "object",
"properties": {
"direct": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"viaFunds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fund": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"shareInFund": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"fund",
"weight",
"shareInFund"
],
"additionalProperties": false
}
}
},
"required": [
"direct",
"viaFunds"
],
"additionalProperties": false
}
},
"required": [
"id",
"isin",
"name",
"weight",
"value",
"sector",
"region",
"provenance"
],
"additionalProperties": false
}
},
"positionCount": {
"type": "integer",
"minimum": 0
},
"unresolvedFundWeight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Whole-portfolio share in undissolved equity fund remainders; these are not named companies."
},
"tailWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"funds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"full",
"partial",
"none"
]
},
"coveredWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"asOf": {
"type": [
"string",
"null"
]
}
},
"required": [
"isin",
"name",
"status",
"coveredWeight",
"asOf"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"positions",
"positionCount",
"unresolvedFundWeight",
"tailWeight",
"funds"
],
"additionalProperties": false
}POST /api/v1/public/portfolio-analysis/concentration
Calculation and limitations →{
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"issuers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"issuerId": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"issuerId",
"name",
"weight"
],
"additionalProperties": false
}
},
"issuerCount": {
"type": [
"integer",
"null"
],
"minimum": 0
},
"tailWeight": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"largestIssuer": {
"type": [
"object",
"null"
],
"properties": {
"issuerId": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"issuerId",
"name",
"weight"
],
"additionalProperties": false
},
"hhi": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1,
"description": "Herfindahl index over the equity issuer book; withheld below 80% coverage."
},
"effectiveN": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Effective issuer count; withheld below 80% coverage."
}
},
"required": [
"scope",
"coverage",
"issuers",
"issuerCount",
"tailWeight",
"largestIssuer",
"hhi",
"effectiveN"
],
"additionalProperties": false
}POST /api/v1/public/portfolio-analysis/sectors
Calculation and limitations →{
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
}POST /api/v1/public/portfolio-analysis/geography
Calculation and limitations →{
"type": "object",
"properties": {
"countries": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
},
"regions": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"countries",
"regions"
],
"additionalProperties": false
}POST /api/v1/public/portfolio-analysis/currencies
Calculation and limitations →{
"type": "object",
"properties": {
"equityExposure": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
},
"qualification": {
"type": "object",
"properties": {
"basis": {
"type": "string",
"enum": [
"caller_supplied_listing_denomination",
"country_proxy_with_name_hedge_assumption"
]
},
"methodologyVersion": {
"type": "string",
"enum": [
"listing-denomination-v1",
"country-name-currency-proxy-v1"
]
},
"independentlyVerified": {
"type": "boolean",
"enum": [
false
]
},
"hedgePolicy": {
"type": "string",
"enum": [
"not_verified"
]
},
"stressUse": {
"type": "string",
"enum": [
"ineligible"
]
},
"weightBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio"
]
},
"coverageBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio",
"valued_equity_value"
]
},
"hedgeRatio": {
"type": "null"
}
},
"required": [
"basis",
"methodologyVersion",
"independentlyVerified",
"hedgePolicy",
"stressUse",
"weightBasis",
"coverageBasis",
"hedgeRatio"
],
"additionalProperties": false
},
"listingQualification": {
"type": "object",
"properties": {
"basis": {
"type": "string",
"enum": [
"caller_supplied_listing_denomination",
"country_proxy_with_name_hedge_assumption"
]
},
"methodologyVersion": {
"type": "string",
"enum": [
"listing-denomination-v1",
"country-name-currency-proxy-v1"
]
},
"independentlyVerified": {
"type": "boolean",
"enum": [
false
]
},
"hedgePolicy": {
"type": "string",
"enum": [
"not_verified"
]
},
"stressUse": {
"type": "string",
"enum": [
"ineligible"
]
},
"weightBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio"
]
},
"coverageBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio",
"valued_equity_value"
]
},
"hedgeRatio": {
"type": "null"
}
},
"required": [
"basis",
"methodologyVersion",
"independentlyVerified",
"hedgePolicy",
"stressUse",
"weightBasis",
"coverageBasis",
"hedgeRatio"
],
"additionalProperties": false
},
"heldCurrencies": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
},
"description": "Resolved listing currencies and caller-stated cash currencies; separate from underlying exposure."
},
"hedgedFunds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"currency": {
"type": [
"string",
"null"
]
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"isin",
"name",
"currency",
"weight"
],
"additionalProperties": false
}
}
},
"required": [
"equityExposure",
"qualification",
"listingQualification",
"heldCurrencies",
"hedgedFunds"
],
"additionalProperties": false
}POST /api/v1/public/portfolio-analysis/costs
Calculation and limitations →{
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"ongoing_fund_charges"
]
},
"coveredPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"fundPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"unknownPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"weightedTer": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "TER fraction on the covered fund portion, not on the entire portfolio. 0.002 means 0.2%."
},
"knownAnnualCost": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Known fund charges in baseCurrency; a subtotal when coverage is incomplete. Null for weight-only input."
},
"positions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"ter": {
"type": [
"number",
"null"
],
"minimum": 0
},
"annualCost": {
"type": [
"number",
"null"
],
"minimum": 0
}
},
"required": [
"isin",
"name",
"weight",
"ter",
"annualCost"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"coveredPortfolioWeight",
"fundPortfolioWeight",
"unknownPortfolioWeight",
"weightedTer",
"knownAnnualCost",
"positions"
],
"additionalProperties": false
}POST /api/v1/public/portfolio-analysis/cost-drag
Calculation and limitations →{
"baseCurrency": "EUR",
"initialValue": 10000,
"annualReturn": 0.05,
"annualFeeRate": 0.002,
"monthlyContribution": 100,
"horizonYears": [
10,
20
]
}{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"initialValue": {
"type": "number",
"minimum": 0,
"maximum": 100000000
},
"annualReturn": {
"type": "number",
"minimum": -1,
"maximum": 1,
"description": "Caller-assumed nominal annual return, as a fraction; not a forecast."
},
"annualFeeRate": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Caller-assumed annual fee fraction on the entire modeled amount; zero is an explicit assumption."
},
"monthlyContribution": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0
},
"horizonYears": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1,
"maximum": 50
},
"minItems": 1,
"maxItems": 10
}
},
"required": [
"initialValue",
"annualReturn",
"annualFeeRate",
"horizonYears"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"capability": {
"type": "string",
"enum": [
"cost-drag"
]
},
"analysis": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"model": {
"type": "string",
"enum": [
"nominal_annual_rate_divided_by_12_end_of_month_contributions"
]
},
"initialValue": {
"type": "number",
"minimum": 0
},
"monthlyContribution": {
"type": "number",
"minimum": 0
},
"annualReturn": {
"type": "number"
},
"annualFeeRate": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"horizons": {
"type": "array",
"items": {
"type": "object",
"properties": {
"years": {
"type": "integer",
"exclusiveMinimum": 0
},
"valueWithCost": {
"type": "number",
"minimum": 0
},
"valueWithoutCost": {
"type": "number",
"minimum": 0
},
"totalCostDrag": {
"type": "number",
"minimum": 0
},
"averageAnnualCostDrag": {
"type": "number",
"minimum": 0
},
"costDragFraction": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"years",
"valueWithCost",
"valueWithoutCost",
"totalCostDrag",
"averageAnnualCostDrag",
"costDragFraction"
],
"additionalProperties": false
}
}
},
"required": [
"model",
"initialValue",
"monthlyContribution",
"annualReturn",
"annualFeeRate",
"horizons"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"limitations": {
"type": "array",
"items": {
"type": "string"
}
},
"links": {
"type": "object",
"properties": {
"documentation": {
"type": "string",
"format": "uri"
},
"catalog": {
"type": "string",
"format": "uri"
}
},
"required": [
"documentation",
"catalog"
],
"additionalProperties": false
}
},
"required": [
"modelVersion",
"computedAt",
"baseCurrency",
"capability",
"analysis",
"assumptions",
"limitations",
"links"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"model": {
"type": "string",
"enum": [
"nominal_annual_rate_divided_by_12_end_of_month_contributions"
]
},
"initialValue": {
"type": "number",
"minimum": 0
},
"monthlyContribution": {
"type": "number",
"minimum": 0
},
"annualReturn": {
"type": "number"
},
"annualFeeRate": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"horizons": {
"type": "array",
"items": {
"type": "object",
"properties": {
"years": {
"type": "integer",
"exclusiveMinimum": 0
},
"valueWithCost": {
"type": "number",
"minimum": 0
},
"valueWithoutCost": {
"type": "number",
"minimum": 0
},
"totalCostDrag": {
"type": "number",
"minimum": 0
},
"averageAnnualCostDrag": {
"type": "number",
"minimum": 0
},
"costDragFraction": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"years",
"valueWithCost",
"valueWithoutCost",
"totalCostDrag",
"averageAnnualCostDrag",
"costDragFraction"
],
"additionalProperties": false
}
}
},
"required": [
"model",
"initialValue",
"monthlyContribution",
"annualReturn",
"annualFeeRate",
"horizons"
],
"additionalProperties": false
}POST /api/v1/public/portfolio-analysis/industries
Calculation and limitations →{
"basis": "weights",
"baseCurrency": "EUR",
"holdings": [
{
"isin": "IE00B4L5Y983",
"weight": 0.6
},
{
"isin": "IE00B3XXRP09",
"weight": 0.3
},
{
"assetClass": "cash",
"currency": "EUR",
"weight": 0.1
}
],
"locale": "en"
}{
"anyOf": [
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"weights"
],
"default": "weights"
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"isin",
"weight"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"assetClass",
"currency",
"weight"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"holdings"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"values"
]
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"isin",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"assetClass",
"currency",
"value"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"basis",
"holdings"
],
"additionalProperties": false
}
]
}{
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"capability": {
"type": "string",
"enum": [
"industries"
]
},
"analysis": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"industries": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
},
"unknownWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"tailWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets",
"unknownWeight",
"tailWeight"
],
"additionalProperties": false
},
"industryInterests": {
"type": "object",
"properties": {
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"definitionVersion": {
"type": "integer",
"exclusiveMinimum": 0
},
"weight": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
}
},
"required": [
"key",
"definitionVersion",
"weight"
],
"additionalProperties": false
}
}
},
"required": [
"coverage",
"items"
],
"additionalProperties": false
},
"thematicBaskets": {
"type": "object",
"properties": {
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"definitionVersion": {
"type": "integer",
"exclusiveMinimum": 0
},
"weight": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
}
},
"required": [
"key",
"definitionVersion",
"weight"
],
"additionalProperties": false
}
},
"registryVersion": {
"type": "integer",
"exclusiveMinimum": 0
}
},
"required": [
"coverage",
"items",
"registryVersion"
],
"additionalProperties": false
},
"unresolvedPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"constituentsAsOf": {
"type": [
"string",
"null"
]
}
},
"required": [
"industries",
"industryInterests",
"thematicBaskets",
"unresolvedPortfolioWeight",
"constituentsAsOf"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"limitations": {
"type": "array",
"items": {
"type": "string"
}
},
"links": {
"type": "object",
"properties": {
"documentation": {
"type": "string",
"format": "uri"
},
"catalog": {
"type": "string",
"format": "uri"
}
},
"required": [
"documentation",
"catalog"
],
"additionalProperties": false
}
},
"required": [
"modelVersion",
"computedAt",
"baseCurrency",
"capability",
"analysis",
"assumptions",
"limitations",
"links"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"industries": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
},
"unknownWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"tailWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets",
"unknownWeight",
"tailWeight"
],
"additionalProperties": false
},
"industryInterests": {
"type": "object",
"properties": {
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"definitionVersion": {
"type": "integer",
"exclusiveMinimum": 0
},
"weight": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
}
},
"required": [
"key",
"definitionVersion",
"weight"
],
"additionalProperties": false
}
}
},
"required": [
"coverage",
"items"
],
"additionalProperties": false
},
"thematicBaskets": {
"type": "object",
"properties": {
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"definitionVersion": {
"type": "integer",
"exclusiveMinimum": 0
},
"weight": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
}
},
"required": [
"key",
"definitionVersion",
"weight"
],
"additionalProperties": false
}
},
"registryVersion": {
"type": "integer",
"exclusiveMinimum": 0
}
},
"required": [
"coverage",
"items",
"registryVersion"
],
"additionalProperties": false
},
"unresolvedPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"constituentsAsOf": {
"type": [
"string",
"null"
]
}
},
"required": [
"industries",
"industryInterests",
"thematicBaskets",
"unresolvedPortfolioWeight",
"constituentsAsOf"
],
"additionalProperties": false
}POST /api/v1/public/portfolio-analysis/revenue-geography
Calculation and limitations →{
"basis": "weights",
"baseCurrency": "EUR",
"holdings": [
{
"isin": "IE00B4L5Y983",
"weight": 0.6
},
{
"isin": "IE00B3XXRP09",
"weight": 0.3
},
{
"assetClass": "cash",
"currency": "EUR",
"weight": 0.1
}
],
"locale": "en"
}{
"anyOf": [
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"weights"
],
"default": "weights"
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"isin",
"weight"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"assetClass",
"currency",
"weight"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"holdings"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"values"
]
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"isin",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"assetClass",
"currency",
"value"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"basis",
"holdings"
],
"additionalProperties": false
}
]
}{
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"capability": {
"type": "string",
"enum": [
"revenue-geography"
]
},
"analysis": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"coveredPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"unknownWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"unresolvedPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
},
"companyLimit": {
"type": "integer",
"exclusiveMinimum": 0
},
"companiesExamined": {
"type": "integer",
"minimum": 0
},
"companiesCovered": {
"type": "integer",
"minimum": 0
},
"reportAsOf": {
"type": [
"string",
"null"
]
},
"constituentsAsOf": {
"type": [
"string",
"null"
]
},
"unmappedSegments": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"coveredPortfolioWeight",
"unknownWeight",
"unresolvedPortfolioWeight",
"buckets",
"companyLimit",
"companiesExamined",
"companiesCovered",
"reportAsOf",
"constituentsAsOf",
"unmappedSegments"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"limitations": {
"type": "array",
"items": {
"type": "string"
}
},
"links": {
"type": "object",
"properties": {
"documentation": {
"type": "string",
"format": "uri"
},
"catalog": {
"type": "string",
"format": "uri"
}
},
"required": [
"documentation",
"catalog"
],
"additionalProperties": false
}
},
"required": [
"modelVersion",
"computedAt",
"baseCurrency",
"capability",
"analysis",
"assumptions",
"limitations",
"links"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"coveredPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"unknownWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"unresolvedPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
},
"companyLimit": {
"type": "integer",
"exclusiveMinimum": 0
},
"companiesExamined": {
"type": "integer",
"minimum": 0
},
"companiesCovered": {
"type": "integer",
"minimum": 0
},
"reportAsOf": {
"type": [
"string",
"null"
]
},
"constituentsAsOf": {
"type": [
"string",
"null"
]
},
"unmappedSegments": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"coveredPortfolioWeight",
"unknownWeight",
"unresolvedPortfolioWeight",
"buckets",
"companyLimit",
"companiesExamined",
"companiesCovered",
"reportAsOf",
"constituentsAsOf",
"unmappedSegments"
],
"additionalProperties": false
}POST /api/v1/public/portfolio-analysis/compare
Calculation and limitations →{
"before": {
"basis": "weights",
"baseCurrency": "EUR",
"holdings": [
{
"isin": "IE00B4L5Y983",
"weight": 0.6
},
{
"isin": "IE00B3XXRP09",
"weight": 0.3
},
{
"assetClass": "cash",
"currency": "EUR",
"weight": 0.1
}
],
"locale": "en"
},
"after": {
"basis": "weights",
"baseCurrency": "EUR",
"holdings": [
{
"isin": "IE00B4L5Y983",
"weight": 0.8
},
{
"isin": "IE00B3XXRP09",
"weight": 0.1
},
{
"assetClass": "cash",
"currency": "EUR",
"weight": 0.1
}
],
"locale": "en"
}
}{
"type": "object",
"properties": {
"before": {
"anyOf": [
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"weights"
],
"default": "weights"
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"isin",
"weight"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"assetClass",
"currency",
"weight"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"holdings"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"values"
]
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"isin",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"assetClass",
"currency",
"value"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"basis",
"holdings"
],
"additionalProperties": false
}
]
},
"after": {
"anyOf": [
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"weights"
],
"default": "weights"
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"isin",
"weight"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"assetClass",
"currency",
"weight"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"holdings"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"values"
]
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"isin",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"assetClass",
"currency",
"value"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"basis",
"holdings"
],
"additionalProperties": false
}
]
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
}
},
"required": [
"before",
"after"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"capability": {
"type": "string",
"enum": [
"compare"
]
},
"analysis": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"before": {
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"basis": {
"type": "string",
"enum": [
"weights",
"values"
]
},
"totalValue": {
"type": [
"number",
"null"
],
"minimum": 0
},
"resolvedPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"constituentsAsOf": {
"type": [
"string",
"null"
],
"description": "Oldest known fund-constituent date; null when unavailable. Not the date of all reference data."
},
"holdings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0
},
"assetClass": {
"type": [
"string",
"null"
]
},
"status": {
"type": "string",
"enum": [
"resolved",
"unresolved"
]
}
},
"required": [
"isin",
"name",
"weight",
"value",
"assetClass",
"status"
],
"additionalProperties": false
}
},
"analyses": {
"type": "object",
"properties": {
"allocation": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"whole_portfolio"
]
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"overlap": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"method": {
"type": "string",
"enum": [
"sum_minimum_constituent_weights"
]
},
"fundCount": {
"type": "integer",
"minimum": 0
},
"pairs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fundA": {
"type": "string"
},
"fundB": {
"type": "string"
},
"isinA": {
"type": [
"string",
"null"
]
},
"isinB": {
"type": [
"string",
"null"
]
},
"overlap": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Sum of the smaller constituent weights in the two funds, not a percentage of the portfolio."
},
"sharedCount": {
"type": "integer",
"minimum": 0
},
"sharedTail": {
"type": [
"object",
"null"
],
"properties": {
"count": {
"type": "integer",
"minimum": 0
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"count",
"weight"
],
"additionalProperties": false,
"description": "Shared constituents beyond the returned list; weight uses the same overlap measure as the headline."
},
"sharedHoldings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"weightInA": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"weightInB": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"id",
"name",
"weightInA",
"weightInB"
],
"additionalProperties": false
}
}
},
"required": [
"fundA",
"fundB",
"isinA",
"isinB",
"overlap",
"sharedCount",
"sharedTail",
"sharedHoldings"
],
"additionalProperties": false
}
},
"funds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"full",
"partial",
"none"
]
},
"coveredWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"asOf": {
"type": [
"string",
"null"
]
}
},
"required": [
"isin",
"name",
"status",
"coveredWeight",
"asOf"
],
"additionalProperties": false
}
}
},
"required": [
"method",
"fundCount",
"pairs",
"funds"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"look-through": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"positions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0
},
"sector": {
"type": [
"string",
"null"
]
},
"region": {
"type": [
"string",
"null"
]
},
"provenance": {
"type": "object",
"properties": {
"direct": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"viaFunds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fund": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"shareInFund": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"fund",
"weight",
"shareInFund"
],
"additionalProperties": false
}
}
},
"required": [
"direct",
"viaFunds"
],
"additionalProperties": false
}
},
"required": [
"id",
"isin",
"name",
"weight",
"value",
"sector",
"region",
"provenance"
],
"additionalProperties": false
}
},
"positionCount": {
"type": "integer",
"minimum": 0
},
"unresolvedFundWeight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Whole-portfolio share in undissolved equity fund remainders; these are not named companies."
},
"tailWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"funds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"full",
"partial",
"none"
]
},
"coveredWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"asOf": {
"type": [
"string",
"null"
]
}
},
"required": [
"isin",
"name",
"status",
"coveredWeight",
"asOf"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"positions",
"positionCount",
"unresolvedFundWeight",
"tailWeight",
"funds"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"concentration": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"issuers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"issuerId": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"issuerId",
"name",
"weight"
],
"additionalProperties": false
}
},
"issuerCount": {
"type": [
"integer",
"null"
],
"minimum": 0
},
"tailWeight": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"largestIssuer": {
"type": [
"object",
"null"
],
"properties": {
"issuerId": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"issuerId",
"name",
"weight"
],
"additionalProperties": false
},
"hhi": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1,
"description": "Herfindahl index over the equity issuer book; withheld below 80% coverage."
},
"effectiveN": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Effective issuer count; withheld below 80% coverage."
}
},
"required": [
"scope",
"coverage",
"issuers",
"issuerCount",
"tailWeight",
"largestIssuer",
"hhi",
"effectiveN"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"sectors": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"geography": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"countries": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
},
"regions": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"countries",
"regions"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"currencies": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"equityExposure": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
},
"qualification": {
"type": "object",
"properties": {
"basis": {
"type": "string",
"enum": [
"caller_supplied_listing_denomination",
"country_proxy_with_name_hedge_assumption"
]
},
"methodologyVersion": {
"type": "string",
"enum": [
"listing-denomination-v1",
"country-name-currency-proxy-v1"
]
},
"independentlyVerified": {
"type": "boolean",
"enum": [
false
]
},
"hedgePolicy": {
"type": "string",
"enum": [
"not_verified"
]
},
"stressUse": {
"type": "string",
"enum": [
"ineligible"
]
},
"weightBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio"
]
},
"coverageBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio",
"valued_equity_value"
]
},
"hedgeRatio": {
"type": "null"
}
},
"required": [
"basis",
"methodologyVersion",
"independentlyVerified",
"hedgePolicy",
"stressUse",
"weightBasis",
"coverageBasis",
"hedgeRatio"
],
"additionalProperties": false
},
"listingQualification": {
"type": "object",
"properties": {
"basis": {
"type": "string",
"enum": [
"caller_supplied_listing_denomination",
"country_proxy_with_name_hedge_assumption"
]
},
"methodologyVersion": {
"type": "string",
"enum": [
"listing-denomination-v1",
"country-name-currency-proxy-v1"
]
},
"independentlyVerified": {
"type": "boolean",
"enum": [
false
]
},
"hedgePolicy": {
"type": "string",
"enum": [
"not_verified"
]
},
"stressUse": {
"type": "string",
"enum": [
"ineligible"
]
},
"weightBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio"
]
},
"coverageBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio",
"valued_equity_value"
]
},
"hedgeRatio": {
"type": "null"
}
},
"required": [
"basis",
"methodologyVersion",
"independentlyVerified",
"hedgePolicy",
"stressUse",
"weightBasis",
"coverageBasis",
"hedgeRatio"
],
"additionalProperties": false
},
"heldCurrencies": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
},
"description": "Resolved listing currencies and caller-stated cash currencies; separate from underlying exposure."
},
"hedgedFunds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"currency": {
"type": [
"string",
"null"
]
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"isin",
"name",
"currency",
"weight"
],
"additionalProperties": false
}
}
},
"required": [
"equityExposure",
"qualification",
"listingQualification",
"heldCurrencies",
"hedgedFunds"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"costs": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"ongoing_fund_charges"
]
},
"coveredPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"fundPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"unknownPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"weightedTer": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "TER fraction on the covered fund portion, not on the entire portfolio. 0.002 means 0.2%."
},
"knownAnnualCost": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Known fund charges in baseCurrency; a subtotal when coverage is incomplete. Null for weight-only input."
},
"positions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"ter": {
"type": [
"number",
"null"
],
"minimum": 0
},
"annualCost": {
"type": [
"number",
"null"
],
"minimum": 0
}
},
"required": [
"isin",
"name",
"weight",
"ter",
"annualCost"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"coveredPortfolioWeight",
"fundPortfolioWeight",
"unknownPortfolioWeight",
"weightedTer",
"knownAnnualCost",
"positions"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
}
},
"required": [
"allocation",
"overlap",
"look-through",
"concentration",
"sectors",
"geography",
"currencies",
"costs"
],
"additionalProperties": false
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"limitations": {
"type": "array",
"items": {
"type": "string"
}
},
"links": {
"type": "object",
"properties": {
"documentation": {
"type": "string",
"format": "uri"
},
"catalog": {
"type": "string",
"format": "uri"
}
},
"required": [
"documentation",
"catalog"
],
"additionalProperties": false
}
},
"required": [
"modelVersion",
"computedAt",
"baseCurrency",
"basis",
"totalValue",
"resolvedPortfolioWeight",
"constituentsAsOf",
"holdings",
"analyses",
"assumptions",
"limitations",
"links"
],
"additionalProperties": false
},
"after": {
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"basis": {
"type": "string",
"enum": [
"weights",
"values"
]
},
"totalValue": {
"type": [
"number",
"null"
],
"minimum": 0
},
"resolvedPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"constituentsAsOf": {
"type": [
"string",
"null"
],
"description": "Oldest known fund-constituent date; null when unavailable. Not the date of all reference data."
},
"holdings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0
},
"assetClass": {
"type": [
"string",
"null"
]
},
"status": {
"type": "string",
"enum": [
"resolved",
"unresolved"
]
}
},
"required": [
"isin",
"name",
"weight",
"value",
"assetClass",
"status"
],
"additionalProperties": false
}
},
"analyses": {
"type": "object",
"properties": {
"allocation": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"whole_portfolio"
]
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"overlap": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"method": {
"type": "string",
"enum": [
"sum_minimum_constituent_weights"
]
},
"fundCount": {
"type": "integer",
"minimum": 0
},
"pairs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fundA": {
"type": "string"
},
"fundB": {
"type": "string"
},
"isinA": {
"type": [
"string",
"null"
]
},
"isinB": {
"type": [
"string",
"null"
]
},
"overlap": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Sum of the smaller constituent weights in the two funds, not a percentage of the portfolio."
},
"sharedCount": {
"type": "integer",
"minimum": 0
},
"sharedTail": {
"type": [
"object",
"null"
],
"properties": {
"count": {
"type": "integer",
"minimum": 0
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"count",
"weight"
],
"additionalProperties": false,
"description": "Shared constituents beyond the returned list; weight uses the same overlap measure as the headline."
},
"sharedHoldings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"weightInA": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"weightInB": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"id",
"name",
"weightInA",
"weightInB"
],
"additionalProperties": false
}
}
},
"required": [
"fundA",
"fundB",
"isinA",
"isinB",
"overlap",
"sharedCount",
"sharedTail",
"sharedHoldings"
],
"additionalProperties": false
}
},
"funds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"full",
"partial",
"none"
]
},
"coveredWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"asOf": {
"type": [
"string",
"null"
]
}
},
"required": [
"isin",
"name",
"status",
"coveredWeight",
"asOf"
],
"additionalProperties": false
}
}
},
"required": [
"method",
"fundCount",
"pairs",
"funds"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"look-through": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"positions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0
},
"sector": {
"type": [
"string",
"null"
]
},
"region": {
"type": [
"string",
"null"
]
},
"provenance": {
"type": "object",
"properties": {
"direct": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"viaFunds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fund": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"shareInFund": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"fund",
"weight",
"shareInFund"
],
"additionalProperties": false
}
}
},
"required": [
"direct",
"viaFunds"
],
"additionalProperties": false
}
},
"required": [
"id",
"isin",
"name",
"weight",
"value",
"sector",
"region",
"provenance"
],
"additionalProperties": false
}
},
"positionCount": {
"type": "integer",
"minimum": 0
},
"unresolvedFundWeight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Whole-portfolio share in undissolved equity fund remainders; these are not named companies."
},
"tailWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"funds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"full",
"partial",
"none"
]
},
"coveredWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"asOf": {
"type": [
"string",
"null"
]
}
},
"required": [
"isin",
"name",
"status",
"coveredWeight",
"asOf"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"positions",
"positionCount",
"unresolvedFundWeight",
"tailWeight",
"funds"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"concentration": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"issuers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"issuerId": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"issuerId",
"name",
"weight"
],
"additionalProperties": false
}
},
"issuerCount": {
"type": [
"integer",
"null"
],
"minimum": 0
},
"tailWeight": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"largestIssuer": {
"type": [
"object",
"null"
],
"properties": {
"issuerId": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"issuerId",
"name",
"weight"
],
"additionalProperties": false
},
"hhi": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1,
"description": "Herfindahl index over the equity issuer book; withheld below 80% coverage."
},
"effectiveN": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Effective issuer count; withheld below 80% coverage."
}
},
"required": [
"scope",
"coverage",
"issuers",
"issuerCount",
"tailWeight",
"largestIssuer",
"hhi",
"effectiveN"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"sectors": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"geography": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"countries": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
},
"regions": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"countries",
"regions"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"currencies": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"equityExposure": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
},
"qualification": {
"type": "object",
"properties": {
"basis": {
"type": "string",
"enum": [
"caller_supplied_listing_denomination",
"country_proxy_with_name_hedge_assumption"
]
},
"methodologyVersion": {
"type": "string",
"enum": [
"listing-denomination-v1",
"country-name-currency-proxy-v1"
]
},
"independentlyVerified": {
"type": "boolean",
"enum": [
false
]
},
"hedgePolicy": {
"type": "string",
"enum": [
"not_verified"
]
},
"stressUse": {
"type": "string",
"enum": [
"ineligible"
]
},
"weightBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio"
]
},
"coverageBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio",
"valued_equity_value"
]
},
"hedgeRatio": {
"type": "null"
}
},
"required": [
"basis",
"methodologyVersion",
"independentlyVerified",
"hedgePolicy",
"stressUse",
"weightBasis",
"coverageBasis",
"hedgeRatio"
],
"additionalProperties": false
},
"listingQualification": {
"type": "object",
"properties": {
"basis": {
"type": "string",
"enum": [
"caller_supplied_listing_denomination",
"country_proxy_with_name_hedge_assumption"
]
},
"methodologyVersion": {
"type": "string",
"enum": [
"listing-denomination-v1",
"country-name-currency-proxy-v1"
]
},
"independentlyVerified": {
"type": "boolean",
"enum": [
false
]
},
"hedgePolicy": {
"type": "string",
"enum": [
"not_verified"
]
},
"stressUse": {
"type": "string",
"enum": [
"ineligible"
]
},
"weightBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio"
]
},
"coverageBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio",
"valued_equity_value"
]
},
"hedgeRatio": {
"type": "null"
}
},
"required": [
"basis",
"methodologyVersion",
"independentlyVerified",
"hedgePolicy",
"stressUse",
"weightBasis",
"coverageBasis",
"hedgeRatio"
],
"additionalProperties": false
},
"heldCurrencies": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
},
"description": "Resolved listing currencies and caller-stated cash currencies; separate from underlying exposure."
},
"hedgedFunds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"currency": {
"type": [
"string",
"null"
]
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"isin",
"name",
"currency",
"weight"
],
"additionalProperties": false
}
}
},
"required": [
"equityExposure",
"qualification",
"listingQualification",
"heldCurrencies",
"hedgedFunds"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"costs": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"ongoing_fund_charges"
]
},
"coveredPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"fundPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"unknownPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"weightedTer": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "TER fraction on the covered fund portion, not on the entire portfolio. 0.002 means 0.2%."
},
"knownAnnualCost": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Known fund charges in baseCurrency; a subtotal when coverage is incomplete. Null for weight-only input."
},
"positions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"ter": {
"type": [
"number",
"null"
],
"minimum": 0
},
"annualCost": {
"type": [
"number",
"null"
],
"minimum": 0
}
},
"required": [
"isin",
"name",
"weight",
"ter",
"annualCost"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"coveredPortfolioWeight",
"fundPortfolioWeight",
"unknownPortfolioWeight",
"weightedTer",
"knownAnnualCost",
"positions"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
}
},
"required": [
"allocation",
"overlap",
"look-through",
"concentration",
"sectors",
"geography",
"currencies",
"costs"
],
"additionalProperties": false
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"limitations": {
"type": "array",
"items": {
"type": "string"
}
},
"links": {
"type": "object",
"properties": {
"documentation": {
"type": "string",
"format": "uri"
},
"catalog": {
"type": "string",
"format": "uri"
}
},
"required": [
"documentation",
"catalog"
],
"additionalProperties": false
}
},
"required": [
"modelVersion",
"computedAt",
"baseCurrency",
"basis",
"totalValue",
"resolvedPortfolioWeight",
"constituentsAsOf",
"holdings",
"analyses",
"assumptions",
"limitations",
"links"
],
"additionalProperties": false
},
"deltas": {
"type": "object",
"properties": {
"allocation": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"before": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"after": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"delta": {
"type": "number",
"minimum": -1,
"maximum": 1
}
},
"required": [
"key",
"before",
"after",
"delta"
],
"additionalProperties": false
}
},
"sectors": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"before": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"after": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"delta": {
"type": "number",
"minimum": -1,
"maximum": 1
}
},
"required": [
"key",
"before",
"after",
"delta"
],
"additionalProperties": false
}
},
"countries": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"before": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"after": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"delta": {
"type": "number",
"minimum": -1,
"maximum": 1
}
},
"required": [
"key",
"before",
"after",
"delta"
],
"additionalProperties": false
}
},
"currencyExposure": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"before": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"after": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"delta": {
"type": "number",
"minimum": -1,
"maximum": 1
}
},
"required": [
"key",
"before",
"after",
"delta"
],
"additionalProperties": false
}
},
"hhi": {
"type": [
"number",
"null"
]
},
"effectiveN": {
"type": [
"number",
"null"
]
},
"weightedTer": {
"type": [
"number",
"null"
]
},
"knownAnnualCost": {
"type": [
"number",
"null"
]
}
},
"required": [
"allocation",
"sectors",
"countries",
"currencyExposure",
"hhi",
"effectiveN",
"weightedTer",
"knownAnnualCost"
],
"additionalProperties": false
}
},
"required": [
"before",
"after",
"deltas"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"limitations": {
"type": "array",
"items": {
"type": "string"
}
},
"links": {
"type": "object",
"properties": {
"documentation": {
"type": "string",
"format": "uri"
},
"catalog": {
"type": "string",
"format": "uri"
}
},
"required": [
"documentation",
"catalog"
],
"additionalProperties": false
}
},
"required": [
"modelVersion",
"computedAt",
"baseCurrency",
"capability",
"analysis",
"assumptions",
"limitations",
"links"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"before": {
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"basis": {
"type": "string",
"enum": [
"weights",
"values"
]
},
"totalValue": {
"type": [
"number",
"null"
],
"minimum": 0
},
"resolvedPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"constituentsAsOf": {
"type": [
"string",
"null"
],
"description": "Oldest known fund-constituent date; null when unavailable. Not the date of all reference data."
},
"holdings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0
},
"assetClass": {
"type": [
"string",
"null"
]
},
"status": {
"type": "string",
"enum": [
"resolved",
"unresolved"
]
}
},
"required": [
"isin",
"name",
"weight",
"value",
"assetClass",
"status"
],
"additionalProperties": false
}
},
"analyses": {
"type": "object",
"properties": {
"allocation": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"whole_portfolio"
]
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"overlap": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"method": {
"type": "string",
"enum": [
"sum_minimum_constituent_weights"
]
},
"fundCount": {
"type": "integer",
"minimum": 0
},
"pairs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fundA": {
"type": "string"
},
"fundB": {
"type": "string"
},
"isinA": {
"type": [
"string",
"null"
]
},
"isinB": {
"type": [
"string",
"null"
]
},
"overlap": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Sum of the smaller constituent weights in the two funds, not a percentage of the portfolio."
},
"sharedCount": {
"type": "integer",
"minimum": 0
},
"sharedTail": {
"type": [
"object",
"null"
],
"properties": {
"count": {
"type": "integer",
"minimum": 0
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"count",
"weight"
],
"additionalProperties": false,
"description": "Shared constituents beyond the returned list; weight uses the same overlap measure as the headline."
},
"sharedHoldings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"weightInA": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"weightInB": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"id",
"name",
"weightInA",
"weightInB"
],
"additionalProperties": false
}
}
},
"required": [
"fundA",
"fundB",
"isinA",
"isinB",
"overlap",
"sharedCount",
"sharedTail",
"sharedHoldings"
],
"additionalProperties": false
}
},
"funds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"full",
"partial",
"none"
]
},
"coveredWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"asOf": {
"type": [
"string",
"null"
]
}
},
"required": [
"isin",
"name",
"status",
"coveredWeight",
"asOf"
],
"additionalProperties": false
}
}
},
"required": [
"method",
"fundCount",
"pairs",
"funds"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"look-through": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"positions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0
},
"sector": {
"type": [
"string",
"null"
]
},
"region": {
"type": [
"string",
"null"
]
},
"provenance": {
"type": "object",
"properties": {
"direct": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"viaFunds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fund": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"shareInFund": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"fund",
"weight",
"shareInFund"
],
"additionalProperties": false
}
}
},
"required": [
"direct",
"viaFunds"
],
"additionalProperties": false
}
},
"required": [
"id",
"isin",
"name",
"weight",
"value",
"sector",
"region",
"provenance"
],
"additionalProperties": false
}
},
"positionCount": {
"type": "integer",
"minimum": 0
},
"unresolvedFundWeight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Whole-portfolio share in undissolved equity fund remainders; these are not named companies."
},
"tailWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"funds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"full",
"partial",
"none"
]
},
"coveredWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"asOf": {
"type": [
"string",
"null"
]
}
},
"required": [
"isin",
"name",
"status",
"coveredWeight",
"asOf"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"positions",
"positionCount",
"unresolvedFundWeight",
"tailWeight",
"funds"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"concentration": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"issuers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"issuerId": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"issuerId",
"name",
"weight"
],
"additionalProperties": false
}
},
"issuerCount": {
"type": [
"integer",
"null"
],
"minimum": 0
},
"tailWeight": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"largestIssuer": {
"type": [
"object",
"null"
],
"properties": {
"issuerId": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"issuerId",
"name",
"weight"
],
"additionalProperties": false
},
"hhi": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1,
"description": "Herfindahl index over the equity issuer book; withheld below 80% coverage."
},
"effectiveN": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Effective issuer count; withheld below 80% coverage."
}
},
"required": [
"scope",
"coverage",
"issuers",
"issuerCount",
"tailWeight",
"largestIssuer",
"hhi",
"effectiveN"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"sectors": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"geography": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"countries": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
},
"regions": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"countries",
"regions"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"currencies": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"equityExposure": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
},
"qualification": {
"type": "object",
"properties": {
"basis": {
"type": "string",
"enum": [
"caller_supplied_listing_denomination",
"country_proxy_with_name_hedge_assumption"
]
},
"methodologyVersion": {
"type": "string",
"enum": [
"listing-denomination-v1",
"country-name-currency-proxy-v1"
]
},
"independentlyVerified": {
"type": "boolean",
"enum": [
false
]
},
"hedgePolicy": {
"type": "string",
"enum": [
"not_verified"
]
},
"stressUse": {
"type": "string",
"enum": [
"ineligible"
]
},
"weightBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio"
]
},
"coverageBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio",
"valued_equity_value"
]
},
"hedgeRatio": {
"type": "null"
}
},
"required": [
"basis",
"methodologyVersion",
"independentlyVerified",
"hedgePolicy",
"stressUse",
"weightBasis",
"coverageBasis",
"hedgeRatio"
],
"additionalProperties": false
},
"listingQualification": {
"type": "object",
"properties": {
"basis": {
"type": "string",
"enum": [
"caller_supplied_listing_denomination",
"country_proxy_with_name_hedge_assumption"
]
},
"methodologyVersion": {
"type": "string",
"enum": [
"listing-denomination-v1",
"country-name-currency-proxy-v1"
]
},
"independentlyVerified": {
"type": "boolean",
"enum": [
false
]
},
"hedgePolicy": {
"type": "string",
"enum": [
"not_verified"
]
},
"stressUse": {
"type": "string",
"enum": [
"ineligible"
]
},
"weightBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio"
]
},
"coverageBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio",
"valued_equity_value"
]
},
"hedgeRatio": {
"type": "null"
}
},
"required": [
"basis",
"methodologyVersion",
"independentlyVerified",
"hedgePolicy",
"stressUse",
"weightBasis",
"coverageBasis",
"hedgeRatio"
],
"additionalProperties": false
},
"heldCurrencies": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
},
"description": "Resolved listing currencies and caller-stated cash currencies; separate from underlying exposure."
},
"hedgedFunds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"currency": {
"type": [
"string",
"null"
]
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"isin",
"name",
"currency",
"weight"
],
"additionalProperties": false
}
}
},
"required": [
"equityExposure",
"qualification",
"listingQualification",
"heldCurrencies",
"hedgedFunds"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"costs": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"ongoing_fund_charges"
]
},
"coveredPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"fundPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"unknownPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"weightedTer": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "TER fraction on the covered fund portion, not on the entire portfolio. 0.002 means 0.2%."
},
"knownAnnualCost": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Known fund charges in baseCurrency; a subtotal when coverage is incomplete. Null for weight-only input."
},
"positions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"ter": {
"type": [
"number",
"null"
],
"minimum": 0
},
"annualCost": {
"type": [
"number",
"null"
],
"minimum": 0
}
},
"required": [
"isin",
"name",
"weight",
"ter",
"annualCost"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"coveredPortfolioWeight",
"fundPortfolioWeight",
"unknownPortfolioWeight",
"weightedTer",
"knownAnnualCost",
"positions"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
}
},
"required": [
"allocation",
"overlap",
"look-through",
"concentration",
"sectors",
"geography",
"currencies",
"costs"
],
"additionalProperties": false
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"limitations": {
"type": "array",
"items": {
"type": "string"
}
},
"links": {
"type": "object",
"properties": {
"documentation": {
"type": "string",
"format": "uri"
},
"catalog": {
"type": "string",
"format": "uri"
}
},
"required": [
"documentation",
"catalog"
],
"additionalProperties": false
}
},
"required": [
"modelVersion",
"computedAt",
"baseCurrency",
"basis",
"totalValue",
"resolvedPortfolioWeight",
"constituentsAsOf",
"holdings",
"analyses",
"assumptions",
"limitations",
"links"
],
"additionalProperties": false
},
"after": {
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"basis": {
"type": "string",
"enum": [
"weights",
"values"
]
},
"totalValue": {
"type": [
"number",
"null"
],
"minimum": 0
},
"resolvedPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"constituentsAsOf": {
"type": [
"string",
"null"
],
"description": "Oldest known fund-constituent date; null when unavailable. Not the date of all reference data."
},
"holdings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0
},
"assetClass": {
"type": [
"string",
"null"
]
},
"status": {
"type": "string",
"enum": [
"resolved",
"unresolved"
]
}
},
"required": [
"isin",
"name",
"weight",
"value",
"assetClass",
"status"
],
"additionalProperties": false
}
},
"analyses": {
"type": "object",
"properties": {
"allocation": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"whole_portfolio"
]
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"overlap": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"method": {
"type": "string",
"enum": [
"sum_minimum_constituent_weights"
]
},
"fundCount": {
"type": "integer",
"minimum": 0
},
"pairs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fundA": {
"type": "string"
},
"fundB": {
"type": "string"
},
"isinA": {
"type": [
"string",
"null"
]
},
"isinB": {
"type": [
"string",
"null"
]
},
"overlap": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Sum of the smaller constituent weights in the two funds, not a percentage of the portfolio."
},
"sharedCount": {
"type": "integer",
"minimum": 0
},
"sharedTail": {
"type": [
"object",
"null"
],
"properties": {
"count": {
"type": "integer",
"minimum": 0
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"count",
"weight"
],
"additionalProperties": false,
"description": "Shared constituents beyond the returned list; weight uses the same overlap measure as the headline."
},
"sharedHoldings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"weightInA": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"weightInB": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"id",
"name",
"weightInA",
"weightInB"
],
"additionalProperties": false
}
}
},
"required": [
"fundA",
"fundB",
"isinA",
"isinB",
"overlap",
"sharedCount",
"sharedTail",
"sharedHoldings"
],
"additionalProperties": false
}
},
"funds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"full",
"partial",
"none"
]
},
"coveredWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"asOf": {
"type": [
"string",
"null"
]
}
},
"required": [
"isin",
"name",
"status",
"coveredWeight",
"asOf"
],
"additionalProperties": false
}
}
},
"required": [
"method",
"fundCount",
"pairs",
"funds"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"look-through": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"positions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0
},
"sector": {
"type": [
"string",
"null"
]
},
"region": {
"type": [
"string",
"null"
]
},
"provenance": {
"type": "object",
"properties": {
"direct": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"viaFunds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fund": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"shareInFund": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"fund",
"weight",
"shareInFund"
],
"additionalProperties": false
}
}
},
"required": [
"direct",
"viaFunds"
],
"additionalProperties": false
}
},
"required": [
"id",
"isin",
"name",
"weight",
"value",
"sector",
"region",
"provenance"
],
"additionalProperties": false
}
},
"positionCount": {
"type": "integer",
"minimum": 0
},
"unresolvedFundWeight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Whole-portfolio share in undissolved equity fund remainders; these are not named companies."
},
"tailWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"funds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"full",
"partial",
"none"
]
},
"coveredWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"asOf": {
"type": [
"string",
"null"
]
}
},
"required": [
"isin",
"name",
"status",
"coveredWeight",
"asOf"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"positions",
"positionCount",
"unresolvedFundWeight",
"tailWeight",
"funds"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"concentration": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"issuers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"issuerId": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"issuerId",
"name",
"weight"
],
"additionalProperties": false
}
},
"issuerCount": {
"type": [
"integer",
"null"
],
"minimum": 0
},
"tailWeight": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"largestIssuer": {
"type": [
"object",
"null"
],
"properties": {
"issuerId": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"issuerId",
"name",
"weight"
],
"additionalProperties": false
},
"hhi": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1,
"description": "Herfindahl index over the equity issuer book; withheld below 80% coverage."
},
"effectiveN": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Effective issuer count; withheld below 80% coverage."
}
},
"required": [
"scope",
"coverage",
"issuers",
"issuerCount",
"tailWeight",
"largestIssuer",
"hhi",
"effectiveN"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"sectors": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"geography": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"countries": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
},
"regions": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"countries",
"regions"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"currencies": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"equityExposure": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
},
"qualification": {
"type": "object",
"properties": {
"basis": {
"type": "string",
"enum": [
"caller_supplied_listing_denomination",
"country_proxy_with_name_hedge_assumption"
]
},
"methodologyVersion": {
"type": "string",
"enum": [
"listing-denomination-v1",
"country-name-currency-proxy-v1"
]
},
"independentlyVerified": {
"type": "boolean",
"enum": [
false
]
},
"hedgePolicy": {
"type": "string",
"enum": [
"not_verified"
]
},
"stressUse": {
"type": "string",
"enum": [
"ineligible"
]
},
"weightBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio"
]
},
"coverageBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio",
"valued_equity_value"
]
},
"hedgeRatio": {
"type": "null"
}
},
"required": [
"basis",
"methodologyVersion",
"independentlyVerified",
"hedgePolicy",
"stressUse",
"weightBasis",
"coverageBasis",
"hedgeRatio"
],
"additionalProperties": false
},
"listingQualification": {
"type": "object",
"properties": {
"basis": {
"type": "string",
"enum": [
"caller_supplied_listing_denomination",
"country_proxy_with_name_hedge_assumption"
]
},
"methodologyVersion": {
"type": "string",
"enum": [
"listing-denomination-v1",
"country-name-currency-proxy-v1"
]
},
"independentlyVerified": {
"type": "boolean",
"enum": [
false
]
},
"hedgePolicy": {
"type": "string",
"enum": [
"not_verified"
]
},
"stressUse": {
"type": "string",
"enum": [
"ineligible"
]
},
"weightBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio"
]
},
"coverageBasis": {
"type": "string",
"enum": [
"whole_valued_portfolio",
"valued_equity_value"
]
},
"hedgeRatio": {
"type": "null"
}
},
"required": [
"basis",
"methodologyVersion",
"independentlyVerified",
"hedgePolicy",
"stressUse",
"weightBasis",
"coverageBasis",
"hedgeRatio"
],
"additionalProperties": false
},
"heldCurrencies": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
},
"description": "Resolved listing currencies and caller-stated cash currencies; separate from underlying exposure."
},
"hedgedFunds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"currency": {
"type": [
"string",
"null"
]
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"isin",
"name",
"currency",
"weight"
],
"additionalProperties": false
}
}
},
"required": [
"equityExposure",
"qualification",
"listingQualification",
"heldCurrencies",
"hedgedFunds"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"costs": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"ongoing_fund_charges"
]
},
"coveredPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"fundPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"unknownPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"weightedTer": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "TER fraction on the covered fund portion, not on the entire portfolio. 0.002 means 0.2%."
},
"knownAnnualCost": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Known fund charges in baseCurrency; a subtotal when coverage is incomplete. Null for weight-only input."
},
"positions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"ter": {
"type": [
"number",
"null"
],
"minimum": 0
},
"annualCost": {
"type": [
"number",
"null"
],
"minimum": 0
}
},
"required": [
"isin",
"name",
"weight",
"ter",
"annualCost"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"coveredPortfolioWeight",
"fundPortfolioWeight",
"unknownPortfolioWeight",
"weightedTer",
"knownAnnualCost",
"positions"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
}
},
"required": [
"allocation",
"overlap",
"look-through",
"concentration",
"sectors",
"geography",
"currencies",
"costs"
],
"additionalProperties": false
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"limitations": {
"type": "array",
"items": {
"type": "string"
}
},
"links": {
"type": "object",
"properties": {
"documentation": {
"type": "string",
"format": "uri"
},
"catalog": {
"type": "string",
"format": "uri"
}
},
"required": [
"documentation",
"catalog"
],
"additionalProperties": false
}
},
"required": [
"modelVersion",
"computedAt",
"baseCurrency",
"basis",
"totalValue",
"resolvedPortfolioWeight",
"constituentsAsOf",
"holdings",
"analyses",
"assumptions",
"limitations",
"links"
],
"additionalProperties": false
},
"deltas": {
"type": "object",
"properties": {
"allocation": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"before": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"after": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"delta": {
"type": "number",
"minimum": -1,
"maximum": 1
}
},
"required": [
"key",
"before",
"after",
"delta"
],
"additionalProperties": false
}
},
"sectors": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"before": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"after": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"delta": {
"type": "number",
"minimum": -1,
"maximum": 1
}
},
"required": [
"key",
"before",
"after",
"delta"
],
"additionalProperties": false
}
},
"countries": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"before": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"after": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"delta": {
"type": "number",
"minimum": -1,
"maximum": 1
}
},
"required": [
"key",
"before",
"after",
"delta"
],
"additionalProperties": false
}
},
"currencyExposure": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"before": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"after": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"delta": {
"type": "number",
"minimum": -1,
"maximum": 1
}
},
"required": [
"key",
"before",
"after",
"delta"
],
"additionalProperties": false
}
},
"hhi": {
"type": [
"number",
"null"
]
},
"effectiveN": {
"type": [
"number",
"null"
]
},
"weightedTer": {
"type": [
"number",
"null"
]
},
"knownAnnualCost": {
"type": [
"number",
"null"
]
}
},
"required": [
"allocation",
"sectors",
"countries",
"currencyExposure",
"hhi",
"effectiveN",
"weightedTer",
"knownAnnualCost"
],
"additionalProperties": false
}
},
"required": [
"before",
"after",
"deltas"
],
"additionalProperties": false
}POST /api/v1/public/portfolio-analysis/contribution-plan
Calculation and limitations →{
"portfolio": {
"basis": "values",
"baseCurrency": "EUR",
"holdings": [
{
"isin": "IE00B4L5Y983",
"value": 6000
},
{
"assetClass": "cash",
"currency": "EUR",
"value": 4000
}
]
},
"targets": [
{
"assetClass": "equities",
"weight": 0.8
},
{
"assetClass": "cash",
"weight": 0.2
}
],
"contribution": 1000,
"minimumAllocation": 0
}{
"type": "object",
"properties": {
"portfolio": {
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"values"
]
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"isin",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"assetClass",
"currency",
"value"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"basis",
"holdings"
],
"additionalProperties": false
},
"targets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"equities",
"bonds",
"cash",
"gold",
"crypto",
"real_estate",
"commodities",
"alternatives"
]
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"assetClass",
"weight"
],
"additionalProperties": false
},
"minItems": 1,
"maxItems": 8
},
"contribution": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"description": "One new contribution, in the portfolio's baseCurrency, in whole cents."
},
"minimumAllocation": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0
}
},
"required": [
"portfolio",
"targets",
"contribution"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"capability": {
"type": "string",
"enum": [
"contribution-plan"
]
},
"analysis": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"method": {
"type": "string",
"enum": [
"proportional_underweight_gaps",
"post_contribution_shortfalls_v1"
]
},
"contribution": {
"type": "number",
"minimum": 0
},
"allocatedAmount": {
"type": "number",
"minimum": 0
},
"unallocatedAmount": {
"type": "number",
"minimum": 0
},
"before": {
"type": "array",
"items": {
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"equities",
"bonds",
"cash",
"gold",
"crypto",
"real_estate",
"commodities",
"alternatives"
]
},
"currentWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"targetWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"deviation": {
"type": "number",
"minimum": -1,
"maximum": 1
},
"value": {
"type": "number",
"minimum": 0
}
},
"required": [
"assetClass",
"currentWeight",
"targetWeight",
"deviation",
"value"
],
"additionalProperties": false
}
},
"after": {
"type": "array",
"items": {
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"equities",
"bonds",
"cash",
"gold",
"crypto",
"real_estate",
"commodities",
"alternatives"
]
},
"currentWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"targetWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"deviation": {
"type": "number",
"minimum": -1,
"maximum": 1
},
"value": {
"type": "number",
"minimum": 0
}
},
"required": [
"assetClass",
"currentWeight",
"targetWeight",
"deviation",
"value"
],
"additionalProperties": false
}
},
"allocations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"equities",
"bonds",
"cash",
"gold",
"crypto",
"real_estate",
"commodities",
"alternatives"
]
},
"amount": {
"type": "number",
"minimum": 0
}
},
"required": [
"assetClass",
"amount"
],
"additionalProperties": false
}
}
},
"required": [
"method",
"contribution",
"allocatedAmount",
"unallocatedAmount",
"before",
"after",
"allocations"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"limitations": {
"type": "array",
"items": {
"type": "string"
}
},
"links": {
"type": "object",
"properties": {
"documentation": {
"type": "string",
"format": "uri"
},
"catalog": {
"type": "string",
"format": "uri"
}
},
"required": [
"documentation",
"catalog"
],
"additionalProperties": false
}
},
"required": [
"modelVersion",
"computedAt",
"baseCurrency",
"capability",
"analysis",
"assumptions",
"limitations",
"links"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"method": {
"type": "string",
"enum": [
"proportional_underweight_gaps",
"post_contribution_shortfalls_v1"
]
},
"contribution": {
"type": "number",
"minimum": 0
},
"allocatedAmount": {
"type": "number",
"minimum": 0
},
"unallocatedAmount": {
"type": "number",
"minimum": 0
},
"before": {
"type": "array",
"items": {
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"equities",
"bonds",
"cash",
"gold",
"crypto",
"real_estate",
"commodities",
"alternatives"
]
},
"currentWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"targetWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"deviation": {
"type": "number",
"minimum": -1,
"maximum": 1
},
"value": {
"type": "number",
"minimum": 0
}
},
"required": [
"assetClass",
"currentWeight",
"targetWeight",
"deviation",
"value"
],
"additionalProperties": false
}
},
"after": {
"type": "array",
"items": {
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"equities",
"bonds",
"cash",
"gold",
"crypto",
"real_estate",
"commodities",
"alternatives"
]
},
"currentWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"targetWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"deviation": {
"type": "number",
"minimum": -1,
"maximum": 1
},
"value": {
"type": "number",
"minimum": 0
}
},
"required": [
"assetClass",
"currentWeight",
"targetWeight",
"deviation",
"value"
],
"additionalProperties": false
}
},
"allocations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"equities",
"bonds",
"cash",
"gold",
"crypto",
"real_estate",
"commodities",
"alternatives"
]
},
"amount": {
"type": "number",
"minimum": 0
}
},
"required": [
"assetClass",
"amount"
],
"additionalProperties": false
}
}
},
"required": [
"method",
"contribution",
"allocatedAmount",
"unallocatedAmount",
"before",
"after",
"allocations"
],
"additionalProperties": false
}POST /api/v1/public/portfolio-analysis/etf-alternatives
Calculation and limitations →{
"isin": "IE00B4L5Y983",
"candidateIsins": [
"IE00BK5BQT80"
],
"baseCurrency": "EUR",
"limit": 5
}{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"candidateIsins": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"minItems": 1,
"maxItems": 10,
"description": "Explicit candidate universe. When omitted, a bounded shared alternatives catalog of every listing venue is read; it may have no entries for this listing."
},
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 10,
"default": 5
}
},
"required": [
"isin"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"capability": {
"type": "string",
"enum": [
"etf-alternatives"
]
},
"analysis": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"model": {
"type": "string",
"enum": [
"half_holdings_quarter_sector_quarter_country"
]
},
"candidateSource": {
"type": "string",
"enum": [
"caller",
"shared_catalog"
]
},
"catalogAsOf": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"source": {
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"name": {
"type": "string"
},
"ter": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"constituentsAsOf": {
"type": [
"string",
"null"
]
},
"holdingsCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"sectorCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"countryCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"isin",
"name",
"ter",
"constituentsAsOf",
"holdingsCoverage",
"sectorCoverage",
"countryCoverage"
],
"additionalProperties": false
},
"candidates": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"name": {
"type": "string"
},
"ter": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"constituentsAsOf": {
"type": [
"string",
"null"
]
},
"holdingsCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"sectorCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"countryCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"status": {
"type": "string",
"enum": [
"ok",
"unavailable"
]
},
"reason": {
"type": [
"string",
"null"
],
"enum": [
"unresolved",
"not_equity_fund",
"missing_cost",
"incomplete_holdings",
"incomplete_vectors",
"provider_unavailable",
null
]
},
"holdingOverlap": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"sectorCosine": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"countryCosine": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"similarityScore": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"terSaving": {
"type": [
"number",
"null"
]
},
"qualifies": {
"type": "boolean"
}
},
"required": [
"isin",
"name",
"ter",
"constituentsAsOf",
"holdingsCoverage",
"sectorCoverage",
"countryCoverage",
"status",
"reason",
"holdingOverlap",
"sectorCosine",
"countryCosine",
"similarityScore",
"terSaving",
"qualifies"
],
"additionalProperties": false
},
"maxItems": 10
},
"matches": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
}
},
"omittedMatches": {
"type": "integer",
"minimum": 0
},
"failure": {
"type": [
"string",
"null"
],
"enum": [
"catalog_empty",
"catalog_unavailable",
"source_unavailable",
null
]
}
},
"required": [
"model",
"candidateSource",
"catalogAsOf",
"source",
"candidates",
"matches",
"omittedMatches",
"failure"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"limitations": {
"type": "array",
"items": {
"type": "string"
}
},
"links": {
"type": "object",
"properties": {
"documentation": {
"type": "string",
"format": "uri"
},
"catalog": {
"type": "string",
"format": "uri"
}
},
"required": [
"documentation",
"catalog"
],
"additionalProperties": false
}
},
"required": [
"modelVersion",
"computedAt",
"baseCurrency",
"capability",
"analysis",
"assumptions",
"limitations",
"links"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"model": {
"type": "string",
"enum": [
"half_holdings_quarter_sector_quarter_country"
]
},
"candidateSource": {
"type": "string",
"enum": [
"caller",
"shared_catalog"
]
},
"catalogAsOf": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"source": {
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"name": {
"type": "string"
},
"ter": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"constituentsAsOf": {
"type": [
"string",
"null"
]
},
"holdingsCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"sectorCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"countryCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"isin",
"name",
"ter",
"constituentsAsOf",
"holdingsCoverage",
"sectorCoverage",
"countryCoverage"
],
"additionalProperties": false
},
"candidates": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"name": {
"type": "string"
},
"ter": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"constituentsAsOf": {
"type": [
"string",
"null"
]
},
"holdingsCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"sectorCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"countryCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"status": {
"type": "string",
"enum": [
"ok",
"unavailable"
]
},
"reason": {
"type": [
"string",
"null"
],
"enum": [
"unresolved",
"not_equity_fund",
"missing_cost",
"incomplete_holdings",
"incomplete_vectors",
"provider_unavailable",
null
]
},
"holdingOverlap": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"sectorCosine": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"countryCosine": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"similarityScore": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"terSaving": {
"type": [
"number",
"null"
]
},
"qualifies": {
"type": "boolean"
}
},
"required": [
"isin",
"name",
"ter",
"constituentsAsOf",
"holdingsCoverage",
"sectorCoverage",
"countryCoverage",
"status",
"reason",
"holdingOverlap",
"sectorCosine",
"countryCosine",
"similarityScore",
"terSaving",
"qualifies"
],
"additionalProperties": false
},
"maxItems": 10
},
"matches": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
}
},
"omittedMatches": {
"type": "integer",
"minimum": 0
},
"failure": {
"type": [
"string",
"null"
],
"enum": [
"catalog_empty",
"catalog_unavailable",
"source_unavailable",
null
]
}
},
"required": [
"model",
"candidateSource",
"catalogAsOf",
"source",
"candidates",
"matches",
"omittedMatches",
"failure"
],
"additionalProperties": false
}POST /api/v1/public/portfolio-analysis/stress-scenarios
Calculation and limitations →[
{
"key": "gfc_2008",
"name": {
"de": "Finanzkrise 2008",
"en": "Global Financial Crisis 2008"
},
"dateFrom": "2007-10-09",
"dateTo": "2009-03-09",
"approximate": true,
"provenance": {
"approximate": true,
"methodology": "Headline −0.57 is the S&P 500 peak-to-trough (2007-10-09 close 1565.15 → 2009-03-09 close 676.53, ≈ −56.8%). Sector shocks are rounded approximations of MSCI/GICS sector index peak-to-trough over the same window; asset-class shocks are rounded directional approximations from published cross-asset moves. Currency moves are each currency's move against the euro, computed from the ECB euro foreign exchange reference rates on 2007-10-09 and 2009-03-09 (start rate / end rate - 1, rounded to two decimals; checked 2026-11-11). Crypto has no figure of its own in this window and takes the shares figure as a stand-in, a scenario assumption rather than a measured crypto move. Not a backtest of the user's holdings.",
"sources": [
"S&P 500 index, peak 2007-10-09 → trough 2009-03-09 (≈ −56.8%) — https://www.spglobal.com/spdji/en/indices/equity/sp-500/",
"MSCI World / GICS sector indices, 2007–2009 drawdown — https://www.msci.com/end-of-day-data-search",
"NBER US recession dating, Dec 2007 – Jun 2009 — https://www.nber.org/research/business-cycle-dating",
"ECB euro foreign exchange reference rates, 2007-10-09 and 2009-03-09 (currency moves against the euro) · https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html"
],
"reviewedAt": "2026-05-31",
"currencyReviewedAt": "2026-11-11"
}
},
{
"key": "covid_2020",
"name": {
"de": "COVID-19 Crash 2020",
"en": "COVID-19 Crash 2020"
},
"dateFrom": "2020-02-19",
"dateTo": "2020-03-23",
"approximate": true,
"provenance": {
"approximate": true,
"methodology": "Headline −0.34 is the S&P 500 peak-to-trough (2020-02-19 close 3386.15 → 2020-03-23 close 2237.40, ≈ −33.9%). Sector shocks are rounded approximations of the GICS sector index drops over the same five-week window (Energy worst on the oil-price collapse); asset-class shocks are rounded directional approximations. Currency moves are each currency's move against the euro, computed from the ECB euro foreign exchange reference rates on 2020-02-19 and 2020-03-23 (start rate / end rate - 1, rounded to two decimals; checked 2026-11-11). Not a backtest of the user's holdings.",
"sources": [
"S&P 500 index, peak 2020-02-19 → trough 2020-03-23 (≈ −33.9%) — https://www.spglobal.com/spdji/en/indices/equity/sp-500/",
"S&P 500 GICS sector total returns, Feb–Mar 2020 — https://www.spglobal.com/spdji/en/index-family/equity/us-equity/sp-sectors/",
"WTI crude collapse, Mar 2020 (Energy sector driver) — https://www.eia.gov/dnav/pet/hist/RWTCD.htm",
"ECB euro foreign exchange reference rates, 2020-02-19 and 2020-03-23 (currency moves against the euro) · https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html"
],
"reviewedAt": "2026-05-31",
"currencyReviewedAt": "2026-11-11"
}
},
{
"key": "rate_hike_2022",
"name": {
"de": "Zinsschock 2022",
"en": "Rate Hike Shock 2022"
},
"dateFrom": "2022-01-03",
"dateTo": "2022-10-12",
"approximate": true,
"provenance": {
"approximate": true,
"methodology": "Headline −0.25 is the S&P 500 peak-to-trough (2022-01-03 close 4796.56 → 2022-10-12 close 3577.03, ≈ −25.4%). Sector shocks are rounded approximations reflecting the rate-shock dispersion (long-duration Technology/Communication worst, Energy positive); bonds −0.15 approximates the Bloomberg US Aggregate's record 2022 drawdown; the USD move reflects the EUR/USD slide below parity. Currency moves are each currency's move against the euro, computed from the ECB euro foreign exchange reference rates on 2022-01-03 and 2022-10-12 (start rate / end rate - 1, rounded to two decimals; checked 2026-11-11). Not a backtest of the user's holdings.",
"sources": [
"S&P 500 index, peak 2022-01-03 → trough 2022-10-12 (≈ −25.4%) — https://www.spglobal.com/spdji/en/indices/equity/sp-500/",
"Bloomberg US Aggregate Bond Index 2022 total return ≈ −13% (worst on record) — https://www.bloomberg.com/markets/rates-bonds",
"EUR/USD fell below parity, Sep 2022 — https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/eurofxref-graph-usd.en.html",
"ECB euro foreign exchange reference rates, 2022-01-03 and 2022-10-12 (currency moves against the euro) · https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html"
],
"reviewedAt": "2026-05-31",
"currencyReviewedAt": "2026-11-11"
}
},
{
"key": "euro_crisis_2011",
"name": {
"de": "Eurokrise 2011",
"en": "European Debt Crisis 2011"
},
"dateFrom": "2011-05-02",
"dateTo": "2011-10-04",
"approximate": true,
"provenance": {
"approximate": true,
"methodology": "Headline −0.22 approximates the broad European equity peak-to-trough over the 2011 sovereign-debt sell-off (EURO STOXX 50 ≈ −28% intra-year; S&P 500 ≈ −19% 2011-05-02→2011-10-04). Financials worst on bank/sovereign contagion; CHF positive (safe-haven, pre-SNB-floor). Asset-class shocks are rounded directional approximations. Currency moves are each currency's move against the euro, computed from the ECB euro foreign exchange reference rates on 2011-05-02 and 2011-10-04 (start rate / end rate - 1, rounded to two decimals; checked 2026-11-11). Crypto has no figure of its own in this window and takes the shares figure as a stand-in, a scenario assumption rather than a measured crypto move. Not a backtest of the user's holdings.",
"sources": [
"EURO STOXX 50 index, 2011 drawdown — https://www.stoxx.com/index-details?symbol=SX5E",
"S&P 500 index, peak 2011-05-02 → trough 2011-10-04 (≈ −19%) — https://www.spglobal.com/spdji/en/indices/equity/sp-500/",
"SNB EUR/CHF 1.20 floor announced 2011-09-06 (CHF safe-haven strength) — https://www.snb.ch/en/mmr/reference/pre_20110906/source/pre_20110906.en.pdf",
"ECB euro foreign exchange reference rates, 2011-05-02 and 2011-10-04 (currency moves against the euro) · https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html"
],
"reviewedAt": "2026-05-31",
"currencyReviewedAt": "2026-11-11"
}
},
{
"key": "dotcom_2000",
"name": {
"de": "Dotcom-Blase 2000",
"en": "Dotcom Bubble 2000"
},
"dateFrom": "2000-03-10",
"dateTo": "2002-10-09",
"approximate": true,
"provenance": {
"approximate": true,
"methodology": "Headline −0.49 is the S&P 500 peak-to-trough (2000-03-24 close 1527.46 → 2002-10-09 close 776.76, ≈ −49.1%). Technology −0.78 approximates the NASDAQ Composite's ≈ −78% collapse (5048.62 → 1114.11); other sector shocks are rounded approximations of the dispersion over the bubble unwind. Slowest recovery in the catalog. Currency moves are each currency's move against the euro, computed from the ECB euro foreign exchange reference rates on 2000-03-10 and 2002-10-09 (start rate / end rate - 1, rounded to two decimals; checked 2026-11-11). Crypto has no figure of its own in this window and takes the shares figure as a stand-in, a scenario assumption rather than a measured crypto move. Not a backtest of the user's holdings.",
"sources": [
"S&P 500 index, peak 2000-03-24 → trough 2002-10-09 (≈ −49%) — https://www.spglobal.com/spdji/en/indices/equity/sp-500/",
"NASDAQ Composite, peak 2000-03-10 5048.62 → trough 2002-10-09 1114.11 (≈ −78%) — https://www.nasdaq.com/market-activity/index/comp",
"ECB euro foreign exchange reference rates, 2000-03-10 and 2002-10-09 (currency moves against the euro) · https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html"
],
"reviewedAt": "2026-05-31",
"currencyReviewedAt": "2026-11-11"
}
}
]{
"portfolio": {
"basis": "weights",
"baseCurrency": "EUR",
"holdings": [
{
"isin": "IE00B4L5Y983",
"weight": 0.6
},
{
"isin": "IE00B3XXRP09",
"weight": 0.3
},
{
"assetClass": "cash",
"currency": "EUR",
"weight": 0.1
}
],
"locale": "en"
},
"scenarioKeys": [
"gfc_2008",
"covid_2020",
"rate_hike_2022"
]
}{
"type": "object",
"properties": {
"portfolio": {
"anyOf": [
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"weights"
],
"default": "weights"
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"isin",
"weight"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"assetClass",
"currency",
"weight"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"holdings"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"values"
]
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"isin",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"assetClass",
"currency",
"value"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"basis",
"holdings"
],
"additionalProperties": false
}
]
},
"scenarioKeys": {
"type": "array",
"items": {
"type": "string",
"enum": [
"gfc_2008",
"covid_2020",
"rate_hike_2022",
"euro_crisis_2011",
"dotcom_2000"
]
},
"minItems": 1,
"maxItems": 5
}
},
"required": [
"portfolio",
"scenarioKeys"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"capability": {
"type": "string",
"enum": [
"stress-scenarios"
]
},
"analysis": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"model": {
"type": "string",
"enum": [
"approximate_sector_asset_class_shocks_currency_unknown"
]
},
"scenarios": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string",
"enum": [
"gfc_2008",
"covid_2020",
"rate_hike_2022",
"euro_crisis_2011",
"dotcom_2000"
]
},
"name": {
"type": "string"
},
"dateFrom": {
"type": "string",
"format": "date"
},
"dateTo": {
"type": "string",
"format": "date"
},
"status": {
"type": "string",
"enum": [
"ok",
"unavailable"
]
},
"failure": {
"type": [
"string",
"null"
],
"enum": [
"unresolved_holdings",
"unsupported_base_currency",
"missing_currency",
"missing_scenario_coverage",
null
]
},
"returnFraction": {
"type": [
"number",
"null"
]
},
"preValue": {
"type": [
"number",
"null"
],
"minimum": 0
},
"postValue": {
"type": [
"number",
"null"
],
"minimum": 0
},
"change": {
"type": [
"number",
"null"
]
},
"approximate": {
"type": "boolean",
"enum": [
true
]
},
"methodology": {
"type": "string"
},
"sources": {
"type": "array",
"items": {
"type": "string"
},
"description": "Source descriptions including URLs, preserved from the maintained scenario registry."
},
"reviewedAt": {
"type": [
"string",
"null"
],
"format": "date"
},
"positions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
],
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"cashCurrency": {
"type": [
"string",
"null"
]
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"assetClass": {
"type": "string"
},
"returnFraction": {
"type": "number"
},
"fxShockApplied": {
"type": [
"number",
"null"
]
},
"currencyDecomposition": {
"type": "string",
"enum": [
"unavailable",
"cash_denomination"
]
},
"method": {
"type": "string",
"enum": [
"sector_proxy",
"asset_class_proxy"
]
},
"preValue": {
"type": [
"number",
"null"
],
"minimum": 0
},
"postValue": {
"type": [
"number",
"null"
],
"minimum": 0
},
"change": {
"type": [
"number",
"null"
]
}
},
"required": [
"isin",
"cashCurrency",
"weight",
"assetClass",
"returnFraction",
"fxShockApplied",
"currencyDecomposition",
"method",
"preValue",
"postValue",
"change"
],
"additionalProperties": false
}
}
},
"required": [
"key",
"name",
"dateFrom",
"dateTo",
"status",
"failure",
"returnFraction",
"preValue",
"postValue",
"change",
"approximate",
"methodology",
"sources",
"reviewedAt",
"positions"
],
"additionalProperties": false
}
}
},
"required": [
"model",
"scenarios"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"limitations": {
"type": "array",
"items": {
"type": "string"
}
},
"links": {
"type": "object",
"properties": {
"documentation": {
"type": "string",
"format": "uri"
},
"catalog": {
"type": "string",
"format": "uri"
}
},
"required": [
"documentation",
"catalog"
],
"additionalProperties": false
}
},
"required": [
"modelVersion",
"computedAt",
"baseCurrency",
"capability",
"analysis",
"assumptions",
"limitations",
"links"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"model": {
"type": "string",
"enum": [
"approximate_sector_asset_class_shocks_currency_unknown"
]
},
"scenarios": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string",
"enum": [
"gfc_2008",
"covid_2020",
"rate_hike_2022",
"euro_crisis_2011",
"dotcom_2000"
]
},
"name": {
"type": "string"
},
"dateFrom": {
"type": "string",
"format": "date"
},
"dateTo": {
"type": "string",
"format": "date"
},
"status": {
"type": "string",
"enum": [
"ok",
"unavailable"
]
},
"failure": {
"type": [
"string",
"null"
],
"enum": [
"unresolved_holdings",
"unsupported_base_currency",
"missing_currency",
"missing_scenario_coverage",
null
]
},
"returnFraction": {
"type": [
"number",
"null"
]
},
"preValue": {
"type": [
"number",
"null"
],
"minimum": 0
},
"postValue": {
"type": [
"number",
"null"
],
"minimum": 0
},
"change": {
"type": [
"number",
"null"
]
},
"approximate": {
"type": "boolean",
"enum": [
true
]
},
"methodology": {
"type": "string"
},
"sources": {
"type": "array",
"items": {
"type": "string"
},
"description": "Source descriptions including URLs, preserved from the maintained scenario registry."
},
"reviewedAt": {
"type": [
"string",
"null"
],
"format": "date"
},
"positions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
],
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"cashCurrency": {
"type": [
"string",
"null"
]
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"assetClass": {
"type": "string"
},
"returnFraction": {
"type": "number"
},
"fxShockApplied": {
"type": [
"number",
"null"
]
},
"currencyDecomposition": {
"type": "string",
"enum": [
"unavailable",
"cash_denomination"
]
},
"method": {
"type": "string",
"enum": [
"sector_proxy",
"asset_class_proxy"
]
},
"preValue": {
"type": [
"number",
"null"
],
"minimum": 0
},
"postValue": {
"type": [
"number",
"null"
],
"minimum": 0
},
"change": {
"type": [
"number",
"null"
]
}
},
"required": [
"isin",
"cashCurrency",
"weight",
"assetClass",
"returnFraction",
"fxShockApplied",
"currencyDecomposition",
"method",
"preValue",
"postValue",
"change"
],
"additionalProperties": false
}
}
},
"required": [
"key",
"name",
"dateFrom",
"dateTo",
"status",
"failure",
"returnFraction",
"preValue",
"postValue",
"change",
"approximate",
"methodology",
"sources",
"reviewedAt",
"positions"
],
"additionalProperties": false
}
}
},
"required": [
"model",
"scenarios"
],
"additionalProperties": false
}POST /api/v1/public/portfolio-analysis/historical-replay
Calculation and limitations →{
"portfolio": {
"basis": "weights",
"baseCurrency": "EUR",
"holdings": [
{
"isin": "IE00B4L5Y983",
"weight": 0.6
},
{
"isin": "IE00B3XXRP09",
"weight": 0.3
},
{
"assetClass": "cash",
"currency": "EUR",
"weight": 0.1
}
],
"locale": "en"
},
"startDate": "2021-01-04",
"endDate": "2025-12-31",
"initialValue": 10000,
"monthlyContribution": 100,
"rebalancing": "annual"
}{
"type": "object",
"properties": {
"portfolio": {
"anyOf": [
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"weights"
],
"default": "weights"
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"isin",
"weight"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"assetClass",
"currency",
"weight"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"holdings"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"values"
]
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"isin",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"assetClass",
"currency",
"value"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"basis",
"holdings"
],
"additionalProperties": false
}
]
},
"startDate": {
"type": "string",
"format": "date"
},
"endDate": {
"type": "string",
"format": "date"
},
"initialValue": {
"type": "number",
"minimum": 0,
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Explicit hypothetical initial investment in baseCurrency, independent of current portfolio values."
},
"monthlyContribution": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0,
"description": "Invested on day zero and monthly anniversaries, at the first available trading day at or after each anniversary."
},
"rebalancing": {
"type": "string",
"enum": [
"none",
"annual",
"quarterly"
],
"default": "none"
}
},
"required": [
"portfolio",
"startDate",
"endDate",
"initialValue"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"capability": {
"type": "string",
"enum": [
"historical-replay"
]
},
"analysis": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"model": {
"type": "string",
"enum": [
"historical_current_mix_with_hypothetical_contributions"
]
},
"requestedStart": {
"type": "string",
"format": "date"
},
"requestedEnd": {
"type": "string",
"format": "date"
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"failure": {
"type": [
"string",
"null"
],
"enum": [
"future_window",
"incomplete_portfolio",
"insufficient_history",
null
]
},
"legs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"isin": {
"type": [
"string",
"null"
],
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"status": {
"type": "string",
"enum": [
"included",
"unavailable"
]
},
"reason": {
"type": [
"string",
"null"
],
"enum": [
"unresolved",
"missing_currency",
"missing_history",
"missing_fx",
"insufficient_history",
"stale_history",
"invalid_history",
"provider_unavailable",
null
]
},
"basis": {
"type": [
"string",
"null"
],
"enum": [
"total",
"price",
"nominal_cash",
null
]
},
"quoteCurrency": {
"type": [
"string",
"null"
]
},
"firstDate": {
"type": [
"string",
"null"
],
"format": "date"
},
"lastDate": {
"type": [
"string",
"null"
],
"format": "date"
}
},
"required": [
"key",
"isin",
"weight",
"status",
"reason",
"basis",
"quoteCurrency",
"firstDate",
"lastDate"
],
"additionalProperties": false
}
},
"replay": {
"type": [
"object",
"null"
],
"properties": {
"startDate": {
"type": "string",
"format": "date"
},
"endDate": {
"type": "string",
"format": "date"
},
"mixTotalReturn": {
"type": "number"
},
"mixCagr": {
"type": [
"number",
"null"
]
},
"maxDrawdown": {
"type": "number"
},
"peakDate": {
"type": "string",
"format": "date"
},
"maxDrawdownDate": {
"type": "string",
"format": "date"
},
"recoveryDate": {
"type": [
"string",
"null"
],
"format": "date"
},
"totalContributed": {
"type": "number",
"minimum": 0
},
"endingValue": {
"type": "number",
"minimum": 0
},
"contributionTotalReturn": {
"type": "number"
},
"annualizedReturn": {
"type": [
"number",
"null"
]
},
"resetCount": {
"type": "integer",
"minimum": 0
},
"series": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date": {
"type": "string",
"format": "date"
},
"value": {
"type": "number",
"minimum": 0
}
},
"required": [
"date",
"value"
],
"additionalProperties": false
},
"maxItems": 3700
},
"attribution": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"startWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"endWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"legReturn": {
"type": "number"
},
"contributionToReturn": {
"type": "number"
}
},
"required": [
"key",
"startWeight",
"endWeight",
"legReturn",
"contributionToReturn"
],
"additionalProperties": false
}
}
},
"required": [
"startDate",
"endDate",
"mixTotalReturn",
"mixCagr",
"maxDrawdown",
"peakDate",
"maxDrawdownDate",
"recoveryDate",
"totalContributed",
"endingValue",
"contributionTotalReturn",
"annualizedReturn",
"resetCount",
"series",
"attribution"
],
"additionalProperties": false
}
},
"required": [
"model",
"requestedStart",
"requestedEnd",
"coverage",
"failure",
"legs",
"replay"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"limitations": {
"type": "array",
"items": {
"type": "string"
}
},
"links": {
"type": "object",
"properties": {
"documentation": {
"type": "string",
"format": "uri"
},
"catalog": {
"type": "string",
"format": "uri"
}
},
"required": [
"documentation",
"catalog"
],
"additionalProperties": false
}
},
"required": [
"modelVersion",
"computedAt",
"baseCurrency",
"capability",
"analysis",
"assumptions",
"limitations",
"links"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"model": {
"type": "string",
"enum": [
"historical_current_mix_with_hypothetical_contributions"
]
},
"requestedStart": {
"type": "string",
"format": "date"
},
"requestedEnd": {
"type": "string",
"format": "date"
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"failure": {
"type": [
"string",
"null"
],
"enum": [
"future_window",
"incomplete_portfolio",
"insufficient_history",
null
]
},
"legs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"isin": {
"type": [
"string",
"null"
],
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"status": {
"type": "string",
"enum": [
"included",
"unavailable"
]
},
"reason": {
"type": [
"string",
"null"
],
"enum": [
"unresolved",
"missing_currency",
"missing_history",
"missing_fx",
"insufficient_history",
"stale_history",
"invalid_history",
"provider_unavailable",
null
]
},
"basis": {
"type": [
"string",
"null"
],
"enum": [
"total",
"price",
"nominal_cash",
null
]
},
"quoteCurrency": {
"type": [
"string",
"null"
]
},
"firstDate": {
"type": [
"string",
"null"
],
"format": "date"
},
"lastDate": {
"type": [
"string",
"null"
],
"format": "date"
}
},
"required": [
"key",
"isin",
"weight",
"status",
"reason",
"basis",
"quoteCurrency",
"firstDate",
"lastDate"
],
"additionalProperties": false
}
},
"replay": {
"type": [
"object",
"null"
],
"properties": {
"startDate": {
"type": "string",
"format": "date"
},
"endDate": {
"type": "string",
"format": "date"
},
"mixTotalReturn": {
"type": "number"
},
"mixCagr": {
"type": [
"number",
"null"
]
},
"maxDrawdown": {
"type": "number"
},
"peakDate": {
"type": "string",
"format": "date"
},
"maxDrawdownDate": {
"type": "string",
"format": "date"
},
"recoveryDate": {
"type": [
"string",
"null"
],
"format": "date"
},
"totalContributed": {
"type": "number",
"minimum": 0
},
"endingValue": {
"type": "number",
"minimum": 0
},
"contributionTotalReturn": {
"type": "number"
},
"annualizedReturn": {
"type": [
"number",
"null"
]
},
"resetCount": {
"type": "integer",
"minimum": 0
},
"series": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date": {
"type": "string",
"format": "date"
},
"value": {
"type": "number",
"minimum": 0
}
},
"required": [
"date",
"value"
],
"additionalProperties": false
},
"maxItems": 3700
},
"attribution": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"startWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"endWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"legReturn": {
"type": "number"
},
"contributionToReturn": {
"type": "number"
}
},
"required": [
"key",
"startWeight",
"endWeight",
"legReturn",
"contributionToReturn"
],
"additionalProperties": false
}
}
},
"required": [
"startDate",
"endDate",
"mixTotalReturn",
"mixCagr",
"maxDrawdown",
"peakDate",
"maxDrawdownDate",
"recoveryDate",
"totalContributed",
"endingValue",
"contributionTotalReturn",
"annualizedReturn",
"resetCount",
"series",
"attribution"
],
"additionalProperties": false
}
},
"required": [
"model",
"requestedStart",
"requestedEnd",
"coverage",
"failure",
"legs",
"replay"
],
"additionalProperties": false
}Choose the calculator by the question. Read its input and result schemas, clarify material missing assumptions, and return the result with its limitations and scenario link.
Read the agent guide as Markdown →Estimate German tax on capital income, share sales or equity-fund gains.
Convert a gross dividend to net income, with optional country withholding assumptions.
Estimate advance tax on one fund holding kept for a full year.
Compare modeled wealth from accumulating and distributing funds.
Allocate the annual saver allowance across up to six broker rows.
Project wealth from starting capital and regular contributions in your currency; German fund advance tax is optional in EUR.
Size an emergency reserve and model the time needed to save it.
Estimate property upfront equity, purchase costs and savings time.
Estimate a pension gap from an entered or German statutory pension, and the savings needed to fund it.
Model portfolio withdrawals, tax and depletion over the model horizon.
Estimate gift tax or schedule gifts across allowance windows without prior gifts.
Project a child's investment account, including modeled Kindergeld and NV options.
Estimate Regular, Coast or Barista FIRE targets in today's money.
Compare what two annual cost levels leave after years of saving.
Find the gain that makes up a loss and the time it may take.
Calculate the buys and sells, or the new money, that restore a target mix.
Find the capital that pays a chosen monthly dividend income after tax.
Result schemas describe units and null values field by field. Null does not mean zero euros. asOf is the reference date, not the tax year. Disclose assumed returns and treat them as assumptions rather than forecasts.
POST /compare runs two to ten independent scenarios for one calculator with a shared reference date and language. Each input uses its own defaults and validation; scenarios do not inherit values from one another. Unique ids and request order are preserved. Each successful scenario includes its own browser link.
{
"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
}
}
]
}Check data.summary and every entry in data.scenarios. HTTP 200 can include individual input errors: successful entries have data and error: null; failed entries have data: null and error. Invalid request structures return HTTP 400; unexpected model errors return HTTP 500. Each scenario consumes one unit of the shared rate limit.
Simple parameters such as monthly_rate=500&years=20 load the calculator directly. Tax profiles use taxProfile.filing_status=joint; brokers is a JSON array. Missing fields use defaults. To preserve the complete scenario, use the returned link or the calculator's copy button, which includes subsequent edits.
Open the example scenario →asOf and modelVersion preserve context. Earlier scenario JSON links continue to work; do not mix the formats. Copied and returned links contain input values. Share only values the recipient may see.
Use data.links.calculator exactly as returned. It stores the validated inputs, model version and reference date in readable query parameters. Legacy scenario JSON links remain supported. The linked calculator loads those inputs and remains editable. Do not rebuild the parameter from partial inputs.
Open calculator →Links preserve inputs, not old executable models. The page shows a notice when the saved model version differs from the current one. Keep the returned result and modelVersion if you need a historical record.
Scenario links contain the input values in their URL. Share only values the recipient may see; use generic broker names. Requests do not read or save account data, and calculation responses use Cache-Control: no-store. URLs may still appear in browser history or infrastructure logs.
60 units per client IP per minute across the catalog, schemas and calculations. Ordinary requests cost one unit; comparisons cost one per scenario (two to ten scenarios). Honor Retry-After in seconds. Rate limiting is best-effort when Redis is unavailable. JSON request bodies are limited to 16 KiB. Cross-origin requests are supported without credentials; use credentials: omit in browser clients.
German tax parameters are model assumptions, not a complete tax return. Multi-year projections hold the current parameters constant and renew the statutory allowance each year. Vorabpauschale API v1 covers one holding kept for the full year. Gift scheduling requires zero prior gifts. Kindergeld mode uses the model's fixed monthly benefit instead of monthlyContribution. Read the assumptions and limitations returned by each calculation.
FIRE yearsToFire: null means the target was not reached within the model horizon. Withdrawal yearsUntilDepletion: null means no depletion within the modeled horizon; it does not show that the withdrawals last for life. For savings goals, inspect targetUnreachable and deficit: zero months with zero saving capacity does not mean an unfunded goal is reached.