Investboard / Entwicklerdokumentation
Analysieren Sie Ihr eigenes Portfolio oder nutzen Sie dieselben Modelle wie unsere öffentlichen Rechner. Senden Sie JSON und erhalten Sie Ergebnisse mit Annahmen, Abdeckung und Grenzen. Rechnerergebnisse enthalten zusätzlich einen bearbeitbaren Browser-Link.
Das Beispiel modelliert einen ETF-Sparplan mit angenommener Jahresrendite. Es ist keine Prognose. Für ausgelassene Eingabefelder gelten die im Schema veröffentlichten Standardwerte.
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": "de",
"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/de/rechner/etf-sparplan?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/de/rechner/etf-sparplan",
"documentation": "https://investboard.com/de/rechner/api"
}
},
"error": null,
"meta": {}
}Beispiele und Eingabeschemas werden aus dem Validierungsvertrag des Endpunkts erzeugt. GET auf den Endpunkt liefert Schema und Standardwerte ohne Berechnung.
Berechnen Sie Kapitalertragsteuer, Solidaritätszuschlag und Kirchensteuer auf Ihre Kapitalerträge.
POST /api/v1/public/calculators/abgeltungssteuer
{
"inputs": {
"kapitalertrag": 5000,
"ertragsart": "general",
"taxProfile": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
}
},
"locale": "de"
}{
"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
}Was bleibt von Ihrer Dividende nach Abgeltungsteuer, Soli und Kirchensteuer?
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": "de"
}{
"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
}Berechnen Sie die Vorabsteuer auf Ihre ETFs und Fonds, für die Steuerjahre 2024 bis 2026, fällig jeweils im Januar des Folgejahres.
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": "de"
}{
"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
}Welcher ETF-Typ bringt Ihnen nach Steuern mehr Vermögen? Langfristvergleich mit Vorabpauschale, Teilfreistellung und Sparerpauschbetrag.
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": "de"
}{
"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
}Verteilen Sie Ihren Sparerpauschbetrag auf alle Banken und Broker, ohne Freibetrag liegen zu lassen.
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": "de"
}{
"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
}Berechnen Sie Ihr Vermögen nach 10, 20 oder 30 Jahren, optional mit deutschem Steuerabzug (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": "de"
}{
"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
}Wie viel Sicherheitspolster brauchen Sie?
POST /api/v1/public/calculators/notgroschen
{
"inputs": {
"monthlyExpenses": 2500,
"bufferMonths": 6,
"currentSavings": 0,
"monthlySavingsCapacity": 300,
"parkingVehicle": "tagesgeld"
},
"locale": "de"
}{
"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
}Wie viel brauchen Sie für Ihre Immobilie?
POST /api/v1/public/calculators/eigenkapital
{
"inputs": {
"purchasePrice": 350000,
"bundesland": "nordrhein-westfalen",
"eigenkapitalQuote": 20,
"currentSavings": 30000,
"monthlySavingsCapacity": 500,
"savingsReturnPct": 4
},
"locale": "de"
}{
"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
}Was fehlt Ihnen im Ruhestand?
POST /api/v1/public/calculators/rentenluecke
{
"inputs": {
"currentAge": 35,
"retirementAge": 67,
"grossMonthlyIncome": 4000,
"workingYearsSoFar": 10,
"desiredRetirementIncome": 2500,
"existingPrivateProvision": 0,
"monthlyContribution": 300,
"annualReturnPct": 6
},
"locale": "de"
}{
"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
}Wie lange reicht Ihr Vermögen?
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": "de"
}{
"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
}Freibeträge und Steuerlast berechnen
POST /api/v1/public/calculators/schenkungsteuer
{
"inputs": {
"relationship": "child",
"giftAmount": 100000,
"previousGifts10y": 0,
"numberOfDonors": 1,
"optimizeOverTime": false,
"totalToTransfer": 100000
},
"locale": "de"
}{
"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."
}Was wird aus dem Sparplan Ihres Kindes?
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": "de"
}{
"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
}Wann erreichen Sie finanzielle Unabhängigkeit?
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": "de"
}{
"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
}Analysieren Sie ein Portfolio ohne Investboard-Konto. Senden Sie ISINs mit Gewichten oder Marktwerten. Eine Anfrage liefert Überschneidungen, enthaltene Unternehmen, Konzentration, Sektoren, Geografie, Währungen, Vermögensaufteilung und laufende Fondskosten. Separate Endpunkte ergänzen Kostenprojektionen, Branchen/Themen, Umsatzgeografie, Vorher/Nachher-Vergleiche, Einzahlungsbudgets, ETF-Alternativen, Krisenszenarien und historische Verläufe.
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": "de"
}'Verwenden Sie basis: weights mit positiven Bruchteilen, die zusammen 1 ergeben, oder basis: values mit positiven, bereits in baseCurrency umgerechneten Marktwerten. Mischen Sie weder Gewichte und Werte noch Ursprungswährungen. Wiederholte ISINs werden depotübergreifend zusammengefasst. Liquidität nutzt assetClass: cash und eine Währung. Bei Snapshots und Stressszenarien mit Gewichten sind Geldbeträge im Ergebnis null. Der historische Verlauf nutzt ausdrücklich angegebene hypothetische Anlagebeträge.
{
"basis": "values",
"baseCurrency": "EUR",
"holdings": [
{
"isin": "IE00B4L5Y983",
"value": 6000
},
{
"isin": "IE00B3XXRP09",
"value": 3000
},
{
"assetClass": "cash",
"currency": "EUR",
"value": 1000
}
],
"locale": "de"
}Nutzen Sie die Beispiele und Schemas des jeweiligen Endpunkts. Kostenprojektionen benötigen eigene Rendite- und Kostenannahmen. Die Umsatzgeografie prüft bis zu 25 zugrunde liegende Unternehmen und weist ungedeckte Anteile aus. Bei unvollständigen Abschnitten unterdrückt der Vergleich deren Differenzen. Die Einzahlungsplanung benötigt Marktwerte und eigene Ziele; nicht zugewiesenes Geld bleibt Liquidität.
Jeder Abschnitt enthält status, reasons und data. HTTP 200 kann teilweise verfügbare oder nicht verfügbare Abschnitte enthalten. Die acht Snapshot-Endpunkte markieren die anderen Abschnitte mit not_requested. Die eigenständigen Endpunkte haben eigene Eingabeschemas und liefern capability sowie analysis; prüfen Sie analysis.status. Unbekannte Positionen bleiben als unknown in der Vermögensaufteilung und im Gesamtwert enthalten. Aktienanalysen beschreiben den aufgelösten Teil; bei unbekannten Positionen wird die Unternehmenskonzentration zurückgehalten.
Die Vermögensaufteilung umfasst das eingereichte Portfolio. Durchschau, Sektoren, Länder, Regionen und zugrunde liegende Währungsexposition beziehen sich auf Aktien. Bucket-Gewichte beziehen sich auf das gesamte eingereichte Portfolio; portfolioShare nennt den Aktienanteil, coverage dessen klassifizierten Anteil. Unternehmensgewichte beziehen sich auf den Aktien-Emittentenbestand. Anleihen-, Geldmarkt-, Gold- und Kryptofonds bleiben als Ganzes in der Vermögensaufteilung.
Die zugrunde liegende Währungsexposition wird aus Unternehmensländern und im Fondsnamen genannten Währungsabsicherungen modelliert. heldCurrencies nennt separat aufgelöste Handelswährungen und Liquidität. Dies ist weder eine Umsatzwährungsanalyse noch eine gemessene Wechselkurssensitivität.
Kosten umfassen laufende Fondskosten. weightedTer bezieht sich auf Fonds mit bekannten Kosten, nicht auf das gesamte Portfolio. knownAnnualCost ist bei unvollständiger Abdeckung eine bekannte Teilsumme. Fehlende oder mit null angegebene Anbieter-TER bleibt unbekannt. Ordergebühren, Spreads und Steuern sind ausgeschlossen.
Bestandsdaten und Abdeckung begleiten die Ergebnisse. Fehlende Daten bleiben unbekannt. Eine leere Überschneidungsliste bei unvollständigen Fondsbeständen beweist keine Überschneidungsfreiheit; Paare unter 1 % werden weggelassen. HHI, effektive Emittentenzahl und benannte Emittenten werden unter 80 % Abdeckung zurückgehalten. limit begrenzt ausgegebene Positionen und Unternehmen; tailWeight erhält den ausgelassenen Anteil.
ETF-Alternativen vergleichen höchstens zehn Kandidaten aus Ihrer ISIN-Liste oder dem gemeinsamen Katalog. Stressszenarien nutzen ungefähre Krisenannahmen mit veröffentlichten Quellen. Der historische Verlauf simuliert Ihre heutige Mischung mit datierten Kursen und Wechselkursen. Fehlt die Historie einer Position, wird der Verlauf zurückgehalten. Dividendenbasis und unverzinste Liquidität werden ausgewiesen; Einzahlungen beginnen am Starttag. Die Ergebnisse sind Vergleiche und Simulationen, keine Anlageempfehlungen oder tatsächliche Kontoperformance.
Bis zu 25 eingereichte Positionen je Snapshot und 16 KiB pro Anfrage. Für Portfolioanalysen gilt ein separates gemeinsames Limit von 60 Einheiten je IP und Minute: eine je eingereichter Position (beide Snapshots bei compare), zusätzlich 25 reservierte Unternehmenseinheiten bei revenue-geography. Historische Verläufe kosten zwei Einheiten je Position; ETF-Alternativen zwei je Ausgangsfonds/Kandidat, bei Katalogabrufen mit zehn reservierten Kandidaten. cost-drag und Referenzabrufe kosten eine Einheit. Bei Ausfällen gilt die Begrenzung nach bestem Bemühen. Beachten Sie Retry-After bei HTTP 429. Cross-Origin-Aufrufe nutzen credentials: omit.
Senden Sie Positionen im POST-Body. Eingereichte Portfolios und Analyseergebnisse werden nicht gespeichert; gemeinsame Referenzdaten-Caches können befüllt werden. Zurückgegebene Dokumentationslinks enthalten keine Positionen. Nutzungsereignisse enthalten nur Operation, bekannte Funktion, Status, Dauer und Positionsanzahl.
{
"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
Berechnung und Grenzen →{
"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
Berechnung und Grenzen →{
"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
Berechnung und Grenzen →{
"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
Berechnung und Grenzen →{
"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
Berechnung und Grenzen →{
"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
Berechnung und Grenzen →{
"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
Berechnung und Grenzen →{
"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
Berechnung und Grenzen →{
"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
Berechnung und Grenzen →{
"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
Berechnung und Grenzen →{
"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
Berechnung und Grenzen →{
"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
Berechnung und Grenzen →{
"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
Berechnung und Grenzen →{
"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
Berechnung und Grenzen →{
"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
Berechnung und Grenzen →[
{
"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
Berechnung und Grenzen →{
"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
}Wählen Sie den Rechner nach der Frage. Prüfen Sie Eingabe- und Ergebnisschema, klären Sie wichtige fehlende Annahmen und geben Sie Ergebnis, Grenzen und Szenario-Link gemeinsam zurück.
Agentenleitfaden als Markdown (Englisch) →Deutsche Steuer auf Kapitalerträge, Aktienverkäufe oder Aktienfondsgewinne schätzen.
Eine Bruttodividende nach Steuern berechnen, optional mit länderbezogenen Quellensteuerannahmen.
Vorabpauschale für eine ganzjährig gehaltene Fondsposition schätzen.
Modelliertes Vermögen mit thesaurierenden und ausschüttenden Fonds vergleichen.
Den jährlichen Sparerpauschbetrag auf bis zu sechs Broker verteilen.
Einen ETF-Sparplan mit optionaler modellierter Steuerbelastung hochrechnen.
Eine Notfallreserve bestimmen und die nötige Ansparzeit modellieren.
Eigenkapital, Kaufnebenkosten und Ansparzeit einer Immobilie schätzen.
Eine gesetzliche Rentenlücke und die erforderliche Sparrate schätzen.
Depotentnahmen, Steuern und Kapitalverzehr im Modellhorizont berechnen.
Schenkungsteuer schätzen oder Schenkungen ohne Vorschenkungen zeitlich verteilen.
Ein Kinderdepot einschließlich Kindergeld- und NV-Modelloptionen hochrechnen.
Regular-, Coast- oder Barista-FIRE-Ziele in heutigen Euro schätzen.
Ergebnisschemas beschreiben Einheiten und null-Werte pro Feld. null bedeutet nicht null Euro. asOf ist das Bezugsdatum, nicht das Steuerjahr. Legen Sie angenommene Renditen offen und behandeln Sie sie nicht als Prognosen.
POST /compare berechnet zwei bis zehn unabhängige Szenarien desselben Rechners mit gemeinsamem Bezugsdatum und gemeinsamer Sprache. Jede Eingabe wird separat ergänzt und validiert; kein Szenario erbt Werte eines anderen. Eindeutige ids und die Reihenfolge bleiben erhalten. Jedes erfolgreiche Szenario enthält seinen eigenen Browser-Link.
{
"calculator": "etf-sparplan",
"asOf": "2026-10-15",
"locale": "de",
"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
}
}
]
}Prüfen Sie data.summary und jeden Eintrag in data.scenarios. HTTP 200 kann einzelne Eingabefehler enthalten: Erfolgreiche Einträge haben data und error: null, fehlerhafte data: null und error. Ungültige Anfrage-Strukturen ergeben HTTP 400; unerwartete Modellfehler HTTP 500. Jedes Szenario kostet eine Einheit des gemeinsamen Limits.
Einfache Parameter wie monthly_rate=500&years=20 laden den Rechner direkt. Steuerprofile verwenden taxProfile.filing_status=joint; brokers ist ein JSON-Array. Fehlende Felder nutzen Standardwerte. Für ein vollständig erhaltenes Szenario verwenden Sie den zurückgegebenen Link oder die Kopierschaltfläche des Rechners. Sie übernimmt auch nachträgliche Änderungen.
Beispiel-Szenario öffnen →asOf und modelVersion erhalten den Kontext. Frühere scenario-JSON-Links funktionieren weiterhin; mischen Sie beide Formate nicht. Kopierte und zurückgegebene Links enthalten Eingabewerte. Teilen Sie nur freigegebene Werte.
Nutzen Sie data.links.calculator genau wie zurückgegeben. Lesbare Query-Parameter enthalten die validierten Eingaben, Modellversion und das Bezugsdatum. Frühere scenario-JSON-Links funktionieren weiterhin. Der verlinkte Rechner lädt diese Werte und bleibt bearbeitbar. Erstellen Sie den Parameter nicht aus unvollständigen Eingaben neu.
Rechner öffnen →Links erhalten Eingaben, keinen historischen Modellcode. Bei geänderter Modellversion zeigt die Seite einen Hinweis. Bewahren Sie Ergebnis und modelVersion für historische Nachweise auf.
Szenario-Links enthalten die Eingabewerte in der URL. Teilen Sie nur freigegebene Werte und nutzen Sie allgemeine Brokernamen. Anfragen lesen und speichern keine Kontodaten; Berechnungsantworten verwenden Cache-Control: no-store. URLs können trotzdem im Browserverlauf oder in Infrastrukturprotokollen erscheinen.
60 Einheiten je Client-IP pro Minute für Katalog, Schemas und Berechnungen zusammen. Reguläre Anfragen kosten eine Einheit; Vergleiche eine je Szenario (zwei bis zehn Szenarien). Beachten Sie Retry-After in Sekunden. Bei Redis-Ausfällen gilt die Begrenzung nach bestem Bemühen. JSON-Anfragen sind auf 16 KiB begrenzt. Cross-Origin-Aufrufe funktionieren ohne Zugangsdaten; verwenden Sie credentials: omit im Browser.
Deutsche Steuerparameter sind Modellannahmen, keine vollständige Steuererklärung. Mehrjährige Modelle halten aktuelle Parameter konstant und erneuern den gesetzlichen Pauschbetrag jährlich. Vorabpauschale API v1 bildet eine ganzjährig gehaltene Position ab. Schenkungsplanung setzt null Vorschenkungen voraus. Der Kindergeld-Modus nutzt den festen monatlichen Modellbetrag statt monthlyContribution. Lesen Sie die zurückgegebenen Annahmen und Grenzen.
FIRE yearsToFire: null bedeutet, dass das Ziel im Modellhorizont nicht erreicht wurde. Bei Entnahmeplänen bedeutet yearsUntilDepletion: null keine Erschöpfung im Modellhorizont, keine lebenslange Garantie. Prüfen Sie bei Sparzielen targetUnreachable und deficit: null Monate bei null Sparrate bedeuten kein erreichtes, ungedecktes Ziel.