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-10-15.2",
"inputs": {
"initial_investment": 0,
"monthly_rate": 500,
"annual_increase": 0,
"annual_return": 6,
"years": 20,
"include_tax_drag": false,
"fondstyp": "AKTIENFONDS",
"taxProfile": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
}
},
"asOf": "2026-10-15",
"result": {
"final_value": 232175.55,
"total_contributions": 120000,
"total_growth": 112175.55
},
"links": {
"calculator": "https://investboard.com/calculators/etf-savings-plan?initial_investment=0&monthly_rate=500&annual_increase=0&annual_return=6&years=20&include_tax_drag=false&fondstyp=AKTIENFONDS&taxProfile.bundesland=null&taxProfile.kirchensteuer=false&taxProfile.filing_status=single&taxProfile.sparerpauschbetrag_remaining=1000&asOf=2026-10-15&modelVersion=2026-10-15.2&via=api",
"methodology": "https://investboard.com/calculators/etf-savings-plan",
"documentation": "https://investboard.com/calculators/api"
}
},
"error": null,
"meta": {}
}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"
},
{
"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"
},
{
"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": 2025,
"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": 2025,
"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"
},
{
"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"
},
{
"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_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_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"
},
{
"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": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"over_limit",
"under_utilised",
"january_risk"
]
},
"message": {
"type": "string"
}
},
"required": [
"type",
"message"
],
"additionalProperties": false
}
}
},
"required": [
"brokers",
"total_expected_income",
"total_fsa_available",
"total_fsa_optimal",
"total_tax_current",
"total_tax_optimal",
"savings",
"warnings"
],
"additionalProperties": false
}Calculate your wealth after 10, 20, or 30 years, optionally with German tax deduction (Vorabpauschale).
POST /api/v1/public/calculators/etf-sparplan
{
"inputs": {
"initial_investment": 0,
"monthly_rate": 300,
"annual_increase": 2,
"annual_return": 7,
"years": 20,
"include_tax_drag": false,
"fondstyp": "AKTIENFONDS",
"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": 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": 1,
"maximum": 15,
"default": 7,
"description": "Annual percentage points: 6 means 6%, not 0.06."
},
"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"
},
{
"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."
},
"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%."
}
},
"required": [
"yearly_data",
"final_value",
"total_contributions",
"total_growth",
"total_taxes_paid",
"final_value_no_tax",
"tax_drag_eur",
"tax_drag_pct"
],
"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"
},
"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"
}
},
"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; zero with a positive deficit and no saving capacity does not mean funded."
},
"targetUnreachable": {
"type": "boolean",
"description": "The 600-month horizon was exhausted. Also inspect deficit and saving capacity when monthsToTarget is zero."
},
"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; zero with a positive deficit and no saving capacity does not mean funded."
},
"targetUnreachable": {
"type": "boolean",
"description": "The 600-month horizon was exhausted. Also inspect deficit and saving capacity when monthsToTarget is zero."
},
"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
},
"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."
}
},
"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
}
},
"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"
},
{
"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."
},
"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": "Percentage points: 4 means 4%."
},
"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": "EUR, numeric JSON value (not cents or a formatted string)."
},
"numberOfDonors": {
"type": "integer",
"minimum": 1,
"maximum": 2,
"default": 1
},
"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"
},
{
"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": "Display text; use the 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
}
},
"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"
},
{
"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,
"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",
"description": "EUR, not cents."
},
"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
}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 issuer book. 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 positions 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": [
"en",
"de"
],
"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": [
"en",
"de"
],
"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
},
"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",
"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
},
"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",
"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": [
"en",
"de"
],
"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": [
"en",
"de"
],
"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": [
"en",
"de"
],
"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": [
"en",
"de"
],
"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": [
"en",
"de"
],
"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": [
"en",
"de"
],
"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": [
"en",
"de"
],
"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": [
"en",
"de"
],
"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": [
"en",
"de"
],
"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": [
"en",
"de"
],
"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
},
"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",
"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
},
"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",
"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
},
"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",
"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
},
"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",
"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": [
"en",
"de"
],
"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"
]
},
"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"
]
},
"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 DACH alternatives catalog is read; it may have no entries for this listing."
},
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"en",
"de"
],
"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"
]
},
"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"
]
}
},
"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"
]
},
"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"
]
}
},
"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 and currency shocks are rounded directional approximations from published cross-asset and FX moves. 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"
],
"reviewedAt": "2026-05-31"
}
},
{
"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 and currency shocks are rounded directional approximations. 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"
],
"reviewedAt": "2026-05-31"
}
},
{
"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; FX shocks approximate the EUR/USD slide below parity. 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"
],
"reviewedAt": "2026-05-31"
}
},
{
"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 strongly positive (safe-haven, pre-SNB-floor). Asset-class and currency shocks are rounded directional approximations. 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"
],
"reviewedAt": "2026-05-31"
}
},
{
"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. 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"
],
"reviewedAt": "2026-05-31"
}
}
]{
"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": [
"en",
"de"
],
"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": [
"en",
"de"
],
"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_and_listing_currency_shocks"
]
},
"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"
]
},
"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"
},
"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",
"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_and_listing_currency_shocks"
]
},
"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"
]
},
"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"
},
"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",
"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": [
"en",
"de"
],
"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": [
"en",
"de"
],
"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"
]
},
"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"
]
},
"basis": {
"type": [
"string",
"null"
],
"enum": [
"total",
"price",
"nominal_cash"
]
},
"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"
]
},
"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"
]
},
"basis": {
"type": [
"string",
"null"
],
"enum": [
"total",
"price",
"nominal_cash"
]
},
"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 position held for a full year.
Compare modeled wealth from accumulating and distributing funds.
Allocate the annual saver allowance across up to six broker rows.
Project an ETF savings plan with optional modeled tax drag.
Size an emergency reserve and model the time needed to save it.
Estimate property upfront equity, purchase costs and savings time.
Estimate a German statutory pension gap 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 euros.
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 position held 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.