Investboard / Справочник разработчика
Анализируйте свой портфель или запускайте те же модели, что и общедоступные калькуляторы. Отправьте JSON и получите результаты с допущениями, охватом и ограничениями. Результаты калькуляторов также включают ссылку на редактируемую страницу в браузере.
Этот пример моделирует план регулярных вложений в ETF с предполагаемой годовой доходностью. Он не прогнозирует результаты инвестиций. Для пропущенных полей применяются значения по умолчанию из каждой схемы.
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": "ru",
"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/ru/calculators/etf-savings-plan?lang=ru&initial_investment=0&monthly_rate=500&annual_increase=0&annual_return=6&years=20&include_tax_drag=false&fondstyp=AKTIENFONDS&taxProfile.bundesland=null&taxProfile.kirchensteuer=false&taxProfile.filing_status=single&taxProfile.sparerpauschbetrag_remaining=1000&asOf=2026-10-15&modelVersion=2026-10-15.2&via=api",
"methodology": "https://investboard.com/calculators/etf-savings-plan",
"documentation": "https://investboard.com/calculators/api"
}
},
"error": null,
"meta": {}
}Каждый пример и схема исходных данных ниже созданы из контракта проверки, используемого конечной точкой. Выполните GET конечной точки, чтобы получить ее схему и значения по умолчанию без расчета.
Рассчитайте Kapitalertragsteuer (налог на доходы от капитала), Solidaritätszuschlag (солидарную надбавку) и Kirchensteuer (церковный налог) с доходов от капитала.
POST /api/v1/public/calculators/abgeltungssteuer
{
"inputs": {
"kapitalertrag": 5000,
"ertragsart": "general",
"taxProfile": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
}
},
"locale": "ru"
}{
"type": "object",
"properties": {
"kapitalertrag": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 5000,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"ertragsart": {
"type": "string",
"enum": [
"general",
"aktienverkauf",
"dividende",
"etf"
],
"default": "general"
},
"taxProfile": {
"type": "object",
"properties": {
"bundesland": {
"anyOf": [
{
"type": "string",
"enum": [
"Baden-Württemberg",
"Bayern",
"Berlin",
"Brandenburg",
"Bremen",
"Hamburg",
"Hessen",
"Mecklenburg-Vorpommern",
"Niedersachsen",
"Nordrhein-Westfalen",
"Rheinland-Pfalz",
"Saarland",
"Sachsen",
"Sachsen-Anhalt",
"Schleswig-Holstein",
"Thüringen"
]
},
{
"type": "null"
}
],
"default": null
},
"kirchensteuer": {
"type": "boolean",
"default": false
},
"filing_status": {
"type": "string",
"enum": [
"single",
"joint"
],
"default": "single"
},
"sparerpauschbetrag_remaining": {
"type": "number",
"minimum": 0,
"maximum": 2000,
"default": 1000,
"description": "Remaining EUR allowance for single-year tax calculations. Multi-year projections use the full annual statutory allowance based on filing_status."
}
},
"default": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"brutto_ertrag": {
"type": "number",
"description": "EUR, not cents."
},
"fsa_offset": {
"type": "number",
"description": "EUR, not cents."
},
"steuerpflichtiger_ertrag": {
"type": "number",
"description": "EUR, not cents."
},
"kapitalertragsteuer": {
"type": "number",
"description": "EUR, not cents."
},
"solidaritaetszuschlag": {
"type": "number",
"description": "EUR, not cents."
},
"kirchensteuer": {
"type": "number",
"description": "EUR, not cents."
},
"gesamte_steuer": {
"type": "number",
"description": "EUR, not cents."
},
"effektiver_steuersatz": {
"type": "number",
"description": "Fraction: 0.25 means 25%."
},
"netto_ertrag": {
"type": "number",
"description": "EUR, not cents."
},
"kirchensteuer_rate": {
"type": "number",
"description": "Fraction: 0.25 means 25%."
},
"teilfreistellung_betrag": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"brutto_ertrag",
"fsa_offset",
"steuerpflichtiger_ertrag",
"kapitalertragsteuer",
"solidaritaetszuschlag",
"kirchensteuer",
"gesamte_steuer",
"effektiver_steuersatz",
"netto_ertrag",
"kirchensteuer_rate",
"teilfreistellung_betrag"
],
"additionalProperties": false
}Что остается от дивиденда после Abgeltungsteuer, солидарной надбавки и церковного налога?
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": "ru"
}{
"type": "object",
"properties": {
"brutto_dividende": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 500,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"quelle": {
"type": "string",
"enum": [
"aktie",
"etf_aktien",
"mischfonds"
],
"default": "aktie"
},
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$",
"description": "Optional issuer ISIN used for country-level withholding assumptions; not a live security lookup."
},
"taxProfile": {
"type": "object",
"properties": {
"bundesland": {
"anyOf": [
{
"type": "string",
"enum": [
"Baden-Württemberg",
"Bayern",
"Berlin",
"Brandenburg",
"Bremen",
"Hamburg",
"Hessen",
"Mecklenburg-Vorpommern",
"Niedersachsen",
"Nordrhein-Westfalen",
"Rheinland-Pfalz",
"Saarland",
"Sachsen",
"Sachsen-Anhalt",
"Schleswig-Holstein",
"Thüringen"
]
},
{
"type": "null"
}
],
"default": null
},
"kirchensteuer": {
"type": "boolean",
"default": false
},
"filing_status": {
"type": "string",
"enum": [
"single",
"joint"
],
"default": "single"
},
"sparerpauschbetrag_remaining": {
"type": "number",
"minimum": 0,
"maximum": 2000,
"default": 1000,
"description": "Remaining EUR allowance for single-year tax calculations. Multi-year projections use the full annual statutory allowance based on filing_status."
}
},
"default": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"brutto_dividende": {
"type": "number",
"description": "EUR, not cents."
},
"teilfreistellung_rate": {
"type": "number",
"description": "Fraction: 0.25 means 25%."
},
"teilfreistellung_betrag": {
"type": "number",
"description": "EUR, not cents."
},
"steuerpflichtiger_betrag": {
"type": "number",
"description": "EUR, not cents."
},
"steuer": {
"type": "object",
"properties": {
"brutto_ertrag": {
"type": "number",
"description": "EUR, not cents."
},
"fsa_offset": {
"type": "number",
"description": "EUR, not cents."
},
"steuerpflichtiger_ertrag": {
"type": "number",
"description": "EUR, not cents."
},
"kapitalertragsteuer": {
"type": "number",
"description": "EUR, not cents."
},
"solidaritaetszuschlag": {
"type": "number",
"description": "EUR, not cents."
},
"kirchensteuer": {
"type": "number",
"description": "EUR, not cents."
},
"gesamte_steuer": {
"type": "number",
"description": "EUR, not cents."
},
"effektiver_steuersatz": {
"type": "number",
"description": "Fraction: 0.25 means 25%."
},
"netto_ertrag": {
"type": "number",
"description": "EUR, not cents."
},
"kirchensteuer_rate": {
"type": "number",
"description": "Fraction: 0.25 means 25%."
}
},
"required": [
"brutto_ertrag",
"fsa_offset",
"steuerpflichtiger_ertrag",
"kapitalertragsteuer",
"solidaritaetszuschlag",
"kirchensteuer",
"gesamte_steuer",
"effektiver_steuersatz",
"netto_ertrag",
"kirchensteuer_rate"
],
"additionalProperties": false
},
"quellensteuer_rate": {
"type": "number",
"description": "Fraction: 0.25 means 25%."
},
"quellensteuer_betrag": {
"type": "number",
"description": "EUR, not cents."
},
"anrechenbare_quellensteuer": {
"type": "number",
"description": "EUR, not cents."
},
"erstattungsfaehige_quellensteuer": {
"type": "number",
"description": "EUR, not cents."
},
"deutsche_reststeuer": {
"type": "number",
"description": "EUR, not cents."
},
"quellensteuer_status": {
"type": "string",
"enum": [
"credited",
"fund_level",
"none",
"unavailable"
],
"description": "unavailable means withholding was omitted because country assumptions are unavailable; none means no modeled investor withholding."
},
"netto_dividende": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"brutto_dividende",
"teilfreistellung_rate",
"teilfreistellung_betrag",
"steuerpflichtiger_betrag",
"steuer",
"quellensteuer_rate",
"quellensteuer_betrag",
"anrechenbare_quellensteuer",
"erstattungsfaehige_quellensteuer",
"deutsche_reststeuer",
"quellensteuer_status",
"netto_dividende"
],
"additionalProperties": false
}Рассчитайте авансовый налог по ETF и фондам за налоговые годы с 2024 по 2026, каждый с уплатой в январе следующего года.
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": "ru"
}{
"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"
}
],
"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
}Какой тип ETF дает больше капитала после немецких налогов? Долгосрочное сравнение с Vorabpauschale, частичным освобождением и необлагаемым лимитом сберегателя.
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": "ru"
}{
"type": "object",
"properties": {
"initial_investment": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 10000,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"monthly_contribution": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 300,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"annual_return": {
"type": "number",
"minimum": 1,
"maximum": 15,
"default": 7,
"description": "Annual percentage points: 6 means 6%, not 0.06."
},
"distribution_yield": {
"type": "number",
"minimum": 0,
"maximum": 6,
"default": 2,
"description": "Annual percentage points: 6 means 6%, not 0.06."
},
"years": {
"type": "integer",
"minimum": 1,
"maximum": 40,
"default": 20
},
"fondstyp": {
"type": "string",
"enum": [
"AKTIENFONDS",
"MISCHFONDS",
"SONSTIGE"
],
"default": "AKTIENFONDS"
},
"reinvest_distributions": {
"type": "boolean",
"default": true
},
"taxProfile": {
"type": "object",
"properties": {
"bundesland": {
"anyOf": [
{
"type": "string",
"enum": [
"Baden-Württemberg",
"Bayern",
"Berlin",
"Brandenburg",
"Bremen",
"Hamburg",
"Hessen",
"Mecklenburg-Vorpommern",
"Niedersachsen",
"Nordrhein-Westfalen",
"Rheinland-Pfalz",
"Saarland",
"Sachsen",
"Sachsen-Anhalt",
"Schleswig-Holstein",
"Thüringen"
]
},
{
"type": "null"
}
],
"default": null
},
"kirchensteuer": {
"type": "boolean",
"default": false
},
"filing_status": {
"type": "string",
"enum": [
"single",
"joint"
],
"default": "single"
},
"sparerpauschbetrag_remaining": {
"type": "number",
"minimum": 0,
"maximum": 2000,
"default": 1000,
"description": "Remaining EUR allowance for single-year tax calculations. Multi-year projections use the full annual statutory allowance based on filing_status."
}
},
"default": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"yearly_data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"year": {
"type": "integer",
"minimum": 0,
"description": "Year index from the start of the projection."
},
"thesaurierer_value": {
"type": "number",
"description": "EUR, not cents."
},
"thesaurierer_vorabpauschale_tax": {
"type": "number",
"description": "EUR, not cents."
},
"ausschuetter_value": {
"type": "number",
"description": "EUR, not cents."
},
"ausschuetter_distribution_tax": {
"type": "number",
"description": "EUR, not cents."
},
"ausschuetter_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
}Распределите необлагаемый лимит сберегателя между банками и брокерами, не оставляя его неиспользованным.
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": "ru"
}{
"type": "object",
"properties": {
"brokers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"zinsen": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"dividenden": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"vorabpauschale": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"realisierte_gewinne": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"current_fsa": {
"type": "number",
"minimum": 0,
"maximum": 2000,
"default": 0,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
}
},
"required": [
"name"
],
"additionalProperties": false
},
"minItems": 1,
"maxItems": 6,
"default": [
{
"name": "Broker 1",
"zinsen": 0,
"dividenden": 0,
"vorabpauschale": 0,
"realisierte_gewinne": 0,
"current_fsa": 0
},
{
"name": "Broker 2",
"zinsen": 0,
"dividenden": 0,
"vorabpauschale": 0,
"realisierte_gewinne": 0,
"current_fsa": 0
}
]
},
"taxProfile": {
"type": "object",
"properties": {
"bundesland": {
"anyOf": [
{
"type": "string",
"enum": [
"Baden-Württemberg",
"Bayern",
"Berlin",
"Brandenburg",
"Bremen",
"Hamburg",
"Hessen",
"Mecklenburg-Vorpommern",
"Niedersachsen",
"Nordrhein-Westfalen",
"Rheinland-Pfalz",
"Saarland",
"Sachsen",
"Sachsen-Anhalt",
"Schleswig-Holstein",
"Thüringen"
]
},
{
"type": "null"
}
],
"default": null
},
"kirchensteuer": {
"type": "boolean",
"default": false
},
"filing_status": {
"type": "string",
"enum": [
"single",
"joint"
],
"default": "single"
},
"sparerpauschbetrag_remaining": {
"type": "number",
"minimum": 0,
"maximum": 2000,
"default": 1000,
"description": "Remaining EUR allowance for single-year tax calculations. Multi-year projections use the full annual statutory allowance based on filing_status."
}
},
"default": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"brokers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"expected_income": {
"type": "number",
"description": "EUR, not cents."
},
"current_fsa": {
"type": "number",
"description": "EUR, not cents."
},
"optimal_fsa": {
"type": "number",
"description": "EUR, not cents."
},
"tax_with_current": {
"type": "number",
"description": "EUR, not cents."
},
"tax_with_optimal": {
"type": "number",
"description": "EUR, not cents."
},
"delta": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"name",
"expected_income",
"current_fsa",
"optimal_fsa",
"tax_with_current",
"tax_with_optimal",
"delta"
],
"additionalProperties": false
}
},
"total_expected_income": {
"type": "number",
"description": "EUR, not cents."
},
"total_fsa_available": {
"type": "number",
"description": "EUR, not cents."
},
"total_fsa_optimal": {
"type": "number",
"description": "EUR, not cents."
},
"total_tax_current": {
"type": "number",
"description": "EUR, not cents."
},
"total_tax_optimal": {
"type": "number",
"description": "EUR, not cents."
},
"savings": {
"type": "number",
"description": "EUR, not cents."
},
"warnings": {
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"over_limit"
]
},
"message": {
"type": "string"
},
"allocated": {
"type": "number",
"description": "EUR, not cents."
},
"allowance": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"type",
"message",
"allocated",
"allowance"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"under_utilised"
]
},
"message": {
"type": "string"
},
"brokerIndex": {
"type": "integer",
"minimum": 0
},
"brokerName": {
"type": "string"
},
"allocated": {
"type": "number",
"description": "EUR, not cents."
},
"expected": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"type",
"message",
"brokerIndex",
"brokerName",
"allocated",
"expected"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"january_risk"
]
},
"message": {
"type": "string"
},
"brokerIndex": {
"type": "integer",
"minimum": 0
},
"brokerName": {
"type": "string"
},
"preTax": {
"type": "number",
"description": "EUR, not cents."
},
"allocated": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"type",
"message",
"brokerIndex",
"brokerName",
"preTax",
"allocated"
],
"additionalProperties": false
}
]
}
}
},
"required": [
"brokers",
"total_expected_income",
"total_fsa_available",
"total_fsa_optimal",
"total_tax_current",
"total_tax_optimal",
"savings",
"warnings"
],
"additionalProperties": false
}Рассчитайте капитал через 10, 20 или 30 лет, при выборе с вычетом немецкого налога 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": "ru"
}{
"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"
}
],
"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
}Какая финансовая подушка Вам нужна?
POST /api/v1/public/calculators/notgroschen
{
"inputs": {
"monthlyExpenses": 2500,
"bufferMonths": 6,
"currentSavings": 0,
"monthlySavingsCapacity": 300,
"parkingVehicle": "tagesgeld"
},
"locale": "ru"
}{
"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
}Сколько нужно для Вашей недвижимости?
POST /api/v1/public/calculators/eigenkapital
{
"inputs": {
"purchasePrice": 350000,
"bundesland": "nordrhein-westfalen",
"eigenkapitalQuote": 20,
"currentSavings": 30000,
"monthlySavingsCapacity": 500,
"savingsReturnPct": 4
},
"locale": "ru"
}{
"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
}Чего не хватает для Вашей пенсии?
POST /api/v1/public/calculators/rentenluecke
{
"inputs": {
"currentAge": 35,
"retirementAge": 67,
"grossMonthlyIncome": 4000,
"workingYearsSoFar": 10,
"desiredRetirementIncome": 2500,
"existingPrivateProvision": 0,
"monthlyContribution": 300,
"annualReturnPct": 6
},
"locale": "ru"
}{
"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
}На сколько хватит Вашего капитала?
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": "ru"
}{
"type": "object",
"properties": {
"portfolioValue": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 500000,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"monthlyWithdrawal": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 2000,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"annualReturnPct": {
"type": "number",
"minimum": 0,
"maximum": 15,
"default": 5,
"description": "Annual percentage points: 6 means 6%, not 0.06."
},
"inflationPct": {
"type": "number",
"minimum": 0,
"maximum": 5,
"default": 2,
"description": "Annual percentage points: 6 means 6%, not 0.06."
},
"strategy": {
"type": "string",
"enum": [
"constant_nominal",
"constant_real",
"percentage"
],
"default": "constant_nominal"
},
"percentageRate": {
"type": "number",
"minimum": 0.1,
"maximum": 20,
"default": 4,
"description": "Annual withdrawal percentage points: 4 means 4%."
},
"taxProfile": {
"type": "object",
"properties": {
"bundesland": {
"anyOf": [
{
"type": "string",
"enum": [
"Baden-Württemberg",
"Bayern",
"Berlin",
"Brandenburg",
"Bremen",
"Hamburg",
"Hessen",
"Mecklenburg-Vorpommern",
"Niedersachsen",
"Nordrhein-Westfalen",
"Rheinland-Pfalz",
"Saarland",
"Sachsen",
"Sachsen-Anhalt",
"Schleswig-Holstein",
"Thüringen"
]
},
{
"type": "null"
}
],
"default": null
},
"kirchensteuer": {
"type": "boolean",
"default": false
},
"filing_status": {
"type": "string",
"enum": [
"single",
"joint"
],
"default": "single"
},
"sparerpauschbetrag_remaining": {
"type": "number",
"minimum": 0,
"maximum": 2000,
"default": 1000,
"description": "Remaining EUR allowance for single-year tax calculations. Multi-year projections use the full annual statutory allowance based on filing_status."
}
},
"default": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"additionalProperties": false
}
},
"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
}Рассчитайте необлагаемые лимиты и налоговые обязательства
POST /api/v1/public/calculators/schenkungsteuer
{
"inputs": {
"relationship": "child",
"giftAmount": 100000,
"previousGifts10y": 0,
"numberOfDonors": 1,
"optimizeOverTime": false,
"totalToTransfer": 100000
},
"locale": "ru"
}{
"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."
}До какой суммы вырастут регулярные вложения ребенка?
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": "ru"
}{
"type": "object",
"properties": {
"childAge": {
"type": "integer",
"minimum": 0,
"maximum": 17,
"default": 0
},
"targetAge": {
"type": "integer",
"minimum": 1,
"maximum": 30,
"default": 18
},
"monthlyContribution": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 100,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"initialDeposit": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"annualReturnPct": {
"type": "number",
"minimum": 0,
"maximum": 15,
"default": 7,
"description": "Annual percentage points: 6 means 6%, not 0.06."
},
"useKindergeld": {
"type": "boolean",
"default": false
},
"hasNVBescheinigung": {
"type": "boolean",
"default": false
},
"taxProfile": {
"type": "object",
"properties": {
"bundesland": {
"anyOf": [
{
"type": "string",
"enum": [
"Baden-Württemberg",
"Bayern",
"Berlin",
"Brandenburg",
"Bremen",
"Hamburg",
"Hessen",
"Mecklenburg-Vorpommern",
"Niedersachsen",
"Nordrhein-Westfalen",
"Rheinland-Pfalz",
"Saarland",
"Sachsen",
"Sachsen-Anhalt",
"Schleswig-Holstein",
"Thüringen"
]
},
{
"type": "null"
}
],
"default": null
},
"kirchensteuer": {
"type": "boolean",
"default": false
},
"filing_status": {
"type": "string",
"enum": [
"single",
"joint"
],
"default": "single"
},
"sparerpauschbetrag_remaining": {
"type": "number",
"minimum": 0,
"maximum": 2000,
"default": 1000,
"description": "Remaining EUR allowance for single-year tax calculations. Multi-year projections use the full annual statutory allowance based on filing_status."
}
},
"default": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"yearlyData": {
"type": "array",
"items": {
"type": "object",
"properties": {
"year": {
"type": "integer",
"minimum": 0,
"description": "Year index from the start of the projection."
},
"age": {
"type": "integer",
"description": "Child age in years."
},
"contributionsCumulative": {
"type": "number",
"description": "EUR, not cents."
},
"valueGross": {
"type": "number",
"description": "EUR, not cents."
},
"vorabpauschaleTax": {
"type": "number",
"description": "EUR, not cents."
}
},
"required": [
"year",
"age",
"contributionsCumulative",
"valueGross",
"vorabpauschaleTax"
],
"additionalProperties": false
}
},
"finalValueGross": {
"type": "number",
"description": "EUR, not cents."
},
"totalContributions": {
"type": "number",
"description": "EUR, not cents."
},
"totalGrowth": {
"type": "number",
"description": "EUR, not cents."
},
"finalValueAfterTax": {
"type": "number",
"description": "EUR, not cents."
},
"taxOnSale": {
"type": "number",
"description": "EUR, not cents."
},
"vorabpauschaleCredited": {
"type": "number",
"description": "EUR, not cents."
},
"nvSavings": {
"type": "number",
"description": "EUR, not cents."
},
"kindergeldEquivalent": {
"type": "string",
"description": "Display text; use the numeric result fields for arithmetic."
}
},
"required": [
"yearlyData",
"finalValueGross",
"totalContributions",
"totalGrowth",
"finalValueAfterTax",
"taxOnSale",
"vorabpauschaleCredited",
"nvSavings",
"kindergeldEquivalent"
],
"additionalProperties": false
}Когда Вы достигнете финансовой независимости?
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": "ru"
}{
"type": "object",
"properties": {
"monthlyExpenses": {
"type": "number",
"minimum": 1,
"maximum": 100000000,
"default": 2000,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"currentPortfolio": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 100000,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"monthlyContribution": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 1500,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"annualReturnPct": {
"type": "number",
"minimum": 0,
"maximum": 15,
"default": 7,
"description": "Annual percentage points: 6 means 6%, not 0.06."
},
"withdrawalRatePct": {
"type": "number",
"minimum": 2,
"maximum": 6,
"default": 3.5
},
"currentAge": {
"type": "integer",
"minimum": 18,
"maximum": 70,
"default": 30
},
"partTimeIncome": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 1000,
"description": "EUR, numeric JSON value (not cents or a formatted string)."
},
"targetRetirementAge": {
"type": "integer",
"minimum": 19,
"maximum": 80,
"default": 55
},
"variant": {
"type": "string",
"enum": [
"regular",
"coast",
"barista"
],
"default": "regular"
},
"taxProfile": {
"type": "object",
"properties": {
"bundesland": {
"anyOf": [
{
"type": "string",
"enum": [
"Baden-Württemberg",
"Bayern",
"Berlin",
"Brandenburg",
"Bremen",
"Hamburg",
"Hessen",
"Mecklenburg-Vorpommern",
"Niedersachsen",
"Nordrhein-Westfalen",
"Rheinland-Pfalz",
"Saarland",
"Sachsen",
"Sachsen-Anhalt",
"Schleswig-Holstein",
"Thüringen"
]
},
{
"type": "null"
}
],
"default": null
},
"kirchensteuer": {
"type": "boolean",
"default": false
},
"filing_status": {
"type": "string",
"enum": [
"single",
"joint"
],
"default": "single"
},
"sparerpauschbetrag_remaining": {
"type": "number",
"minimum": 0,
"maximum": 2000,
"default": 1000,
"description": "Remaining EUR allowance for single-year tax calculations. Multi-year projections use the full annual statutory allowance based on filing_status."
}
},
"default": {
"bundesland": null,
"kirchensteuer": false,
"filing_status": "single",
"sparerpauschbetrag_remaining": 1000
},
"additionalProperties": false
}
},
"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
}Анализируйте портфель без аккаунта Investboard. Передайте ISIN и веса или рыночную стоимость. Один запрос возвращает пересечения, базовые компании, концентрацию, секторы, географию, валюты, распределение и текущие затраты фондов. Отдельные конечные точки добавляют сценарии затрат, отрасли и темы, географию выручки, сравнения до и после, бюджеты пополнения, альтернативы ETF, кризисные сценарии и историческое воспроизведение.
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": "ru"
}'Используйте basis: weights с положительными долями с суммой 1 или basis: values с положительной рыночной стоимостью, уже пересчитанной в baseCurrency. Не смешивайте веса со стоимостью или исходные валюты. Повторяющиеся ISIN объединяются по брокерам. Денежные средства используют assetClass: cash и валюту. Запросы снимка и стресс-анализа с весами возвращают денежные результаты null. Историческое воспроизведение использует явные гипотетические суммы вложений.
{
"basis": "values",
"baseCurrency": "EUR",
"holdings": [
{
"isin": "IE00B4L5Y983",
"value": 6000
},
{
"isin": "IE00B3XXRP09",
"value": 3000
},
{
"assetClass": "cash",
"currency": "EUR",
"value": 1000
}
],
"locale": "ru"
}Используйте собственные примеры и схемы каждой конечной точки ниже. Влиянию затрат нужны явные допущения о доходности и комиссиях. География выручки исследует до 25 базовых компаний и сохраняет неохваченный вес. Сравнения с неполными разделами скрывают их изменения. Планированию пополнения нужны стоимость портфеля и Ваши цели; нераспределенные деньги остаются денежными средствами.
Каждый раздел содержит status, reasons и data. HTTP 200 может включать частичные или недоступные разделы. Восемь конечных точек снимка отмечают остальные разделы как not_requested. Отдельные конечные точки имеют собственную схему ввода и возвращают capability и analysis; проверяйте analysis.status. Неизвестные позиции остаются в распределении как unknown и в знаменателе портфеля. Разделы базовых акций описывают распознанную совокупность; концентрация не показывается, если хотя бы одна позиция не распознана.
Распределение охватывает предоставленный портфель. Раскрытие состава фондов, секторы, страны, регионы и базовая валютная зависимость охватывают акции. Веса групп относятся ко всему предоставленному портфелю; portfolioShare указывает совокупность акций, а coverage ее классифицированную долю. Веса концентрации компаний относятся к совокупности эмитентов акций. Фонды облигаций, денежных средств, золота и криптовалют остаются целиком в распределении активов.
Базовая валютная зависимость моделируется по странам компаний и валютным хеджам, указанным фондами. Она отличается от heldCurrencies, описывающего распознанные валюты листинга и денежные средства. Это не валюты выручки и не измеренная чувствительность к валютным курсам.
Затраты охватывают текущие расходы фондов. weightedTer относится к охваченным фондам, а не всему портфелю. knownAnnualCost является известным подытогом при неполном охвате. Отсутствующий или нулевой TER поставщика неизвестен. Комиссии брокера, спреды и налоги исключены.
Результаты сопровождаются датами состава и охватом. Отсутствующие данные остаются неизвестными. Пустой список пересечений при неполном составе фондов не доказывает отсутствия пересечений; пары ниже 1% пропускаются. HHI, эффективное число эмитентов и названные эмитенты не показываются при охвате эмитентов ниже 80%. Число возвращаемых позиций и компаний ограничено limit; tailWeight сохраняет пропущенную долю.
Альтернативы ETF сравнивают не более десяти кандидатов из Вашего списка ISIN или общего каталога. Стресс-сценарии используют приближенные кризисные модели с опубликованными источниками. Историческое воспроизведение моделирует Ваш текущий состав по датированным ценам и валютным курсам; оно не показывает результаты при отсутствии истории любой позиции и раскрывает учет дивидендов и беспроцентных денежных средств. Взносы начинаются с нулевого дня. Это сравнения и моделирование, а не инвестиционные рекомендации или фактическая динамика счета.
До 25 предоставленных позиций на снимок и 16 KiB на запрос. Для анализа портфеля действует отдельный общий лимит 60 единиц на IP в минуту: по одной на предоставленную позицию (оба снимка для compare), плюс 25 зарезервированных единиц компаний для revenue-geography. Историческое воспроизведение стоит две единицы на позицию; альтернативы ETF по две на исходный фонд или кандидата с резервом на десять кандидатов при чтении каталога. cost-drag и discovery стоят одну. При сбоях ограничение действует по возможности. Соблюдайте Retry-After при HTTP 429. Междоменные клиенты используют credentials: omit.
Отправляйте позиции в телах POST-запросов. Предоставленный портфель и результаты анализа не сохраняются; общие кеши справочных данных могут заполняться. Возвращаемые ссылки документации не содержат позиций. События использования содержат только операцию, известную возможность, состояние, длительность и число позиций.
{
"anyOf": [
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"weights"
],
"default": "weights"
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"isin",
"weight"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"assetClass",
"currency",
"weight"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"holdings"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"values"
]
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"isin",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"assetClass",
"currency",
"value"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"basis",
"holdings"
],
"additionalProperties": false
}
]
}{
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"basis": {
"type": "string",
"enum": [
"weights",
"values"
]
},
"totalValue": {
"type": [
"number",
"null"
],
"minimum": 0
},
"resolvedPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"constituentsAsOf": {
"type": [
"string",
"null"
],
"description": "Oldest known fund-constituent date; null when unavailable. Not the date of all reference data."
},
"holdings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0
},
"assetClass": {
"type": [
"string",
"null"
]
},
"status": {
"type": "string",
"enum": [
"resolved",
"unresolved"
]
}
},
"required": [
"isin",
"name",
"weight",
"value",
"assetClass",
"status"
],
"additionalProperties": false
}
},
"analyses": {
"type": "object",
"properties": {
"allocation": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"whole_portfolio"
]
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"overlap": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"method": {
"type": "string",
"enum": [
"sum_minimum_constituent_weights"
]
},
"fundCount": {
"type": "integer",
"minimum": 0
},
"pairs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fundA": {
"type": "string"
},
"fundB": {
"type": "string"
},
"isinA": {
"type": [
"string",
"null"
]
},
"isinB": {
"type": [
"string",
"null"
]
},
"overlap": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Sum of the smaller constituent weights in the two funds, not a percentage of the portfolio."
},
"sharedCount": {
"type": "integer",
"minimum": 0
},
"sharedTail": {
"type": [
"object",
"null"
],
"properties": {
"count": {
"type": "integer",
"minimum": 0
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"count",
"weight"
],
"additionalProperties": false,
"description": "Shared constituents beyond the returned list; weight uses the same overlap measure as the headline."
},
"sharedHoldings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"weightInA": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"weightInB": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"id",
"name",
"weightInA",
"weightInB"
],
"additionalProperties": false
}
}
},
"required": [
"fundA",
"fundB",
"isinA",
"isinB",
"overlap",
"sharedCount",
"sharedTail",
"sharedHoldings"
],
"additionalProperties": false
}
},
"funds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"full",
"partial",
"none"
]
},
"coveredWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"asOf": {
"type": [
"string",
"null"
]
}
},
"required": [
"isin",
"name",
"status",
"coveredWeight",
"asOf"
],
"additionalProperties": false
}
}
},
"required": [
"method",
"fundCount",
"pairs",
"funds"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"look-through": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"positions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0
},
"sector": {
"type": [
"string",
"null"
]
},
"region": {
"type": [
"string",
"null"
]
},
"provenance": {
"type": "object",
"properties": {
"direct": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"viaFunds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fund": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"shareInFund": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"fund",
"weight",
"shareInFund"
],
"additionalProperties": false
}
}
},
"required": [
"direct",
"viaFunds"
],
"additionalProperties": false
}
},
"required": [
"id",
"isin",
"name",
"weight",
"value",
"sector",
"region",
"provenance"
],
"additionalProperties": false
}
},
"positionCount": {
"type": "integer",
"minimum": 0
},
"unresolvedFundWeight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Whole-portfolio share in undissolved equity fund remainders; these are not named companies."
},
"tailWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"funds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"full",
"partial",
"none"
]
},
"coveredWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"asOf": {
"type": [
"string",
"null"
]
}
},
"required": [
"isin",
"name",
"status",
"coveredWeight",
"asOf"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"positions",
"positionCount",
"unresolvedFundWeight",
"tailWeight",
"funds"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"concentration": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"issuers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"issuerId": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"issuerId",
"name",
"weight"
],
"additionalProperties": false
}
},
"issuerCount": {
"type": [
"integer",
"null"
],
"minimum": 0
},
"tailWeight": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"largestIssuer": {
"type": [
"object",
"null"
],
"properties": {
"issuerId": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"issuerId",
"name",
"weight"
],
"additionalProperties": false
},
"hhi": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1,
"description": "Herfindahl index over the equity issuer book; withheld below 80% coverage."
},
"effectiveN": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Effective issuer count; withheld below 80% coverage."
}
},
"required": [
"scope",
"coverage",
"issuers",
"issuerCount",
"tailWeight",
"largestIssuer",
"hhi",
"effectiveN"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"sectors": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"geography": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"countries": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
},
"regions": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"countries",
"regions"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"currencies": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"equityExposure": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
},
"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
Расчёт и ограничения →{
"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
Расчёт и ограничения →{
"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
Расчёт и ограничения →{
"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
Расчёт и ограничения →{
"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
Расчёт и ограничения →{
"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
Расчёт и ограничения →{
"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
Расчёт и ограничения →{
"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
Расчёт и ограничения →{
"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
Расчёт и ограничения →{
"baseCurrency": "EUR",
"initialValue": 10000,
"annualReturn": 0.05,
"annualFeeRate": 0.002,
"monthlyContribution": 100,
"horizonYears": [
10,
20
]
}{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"initialValue": {
"type": "number",
"minimum": 0,
"maximum": 100000000
},
"annualReturn": {
"type": "number",
"minimum": -1,
"maximum": 1,
"description": "Caller-assumed nominal annual return, as a fraction; not a forecast."
},
"annualFeeRate": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Caller-assumed annual fee fraction on the entire modeled amount; zero is an explicit assumption."
},
"monthlyContribution": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0
},
"horizonYears": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1,
"maximum": 50
},
"minItems": 1,
"maxItems": 10
}
},
"required": [
"initialValue",
"annualReturn",
"annualFeeRate",
"horizonYears"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"capability": {
"type": "string",
"enum": [
"cost-drag"
]
},
"analysis": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"model": {
"type": "string",
"enum": [
"nominal_annual_rate_divided_by_12_end_of_month_contributions"
]
},
"initialValue": {
"type": "number",
"minimum": 0
},
"monthlyContribution": {
"type": "number",
"minimum": 0
},
"annualReturn": {
"type": "number"
},
"annualFeeRate": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"horizons": {
"type": "array",
"items": {
"type": "object",
"properties": {
"years": {
"type": "integer",
"exclusiveMinimum": 0
},
"valueWithCost": {
"type": "number",
"minimum": 0
},
"valueWithoutCost": {
"type": "number",
"minimum": 0
},
"totalCostDrag": {
"type": "number",
"minimum": 0
},
"averageAnnualCostDrag": {
"type": "number",
"minimum": 0
},
"costDragFraction": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"years",
"valueWithCost",
"valueWithoutCost",
"totalCostDrag",
"averageAnnualCostDrag",
"costDragFraction"
],
"additionalProperties": false
}
}
},
"required": [
"model",
"initialValue",
"monthlyContribution",
"annualReturn",
"annualFeeRate",
"horizons"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"limitations": {
"type": "array",
"items": {
"type": "string"
}
},
"links": {
"type": "object",
"properties": {
"documentation": {
"type": "string",
"format": "uri"
},
"catalog": {
"type": "string",
"format": "uri"
}
},
"required": [
"documentation",
"catalog"
],
"additionalProperties": false
}
},
"required": [
"modelVersion",
"computedAt",
"baseCurrency",
"capability",
"analysis",
"assumptions",
"limitations",
"links"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"model": {
"type": "string",
"enum": [
"nominal_annual_rate_divided_by_12_end_of_month_contributions"
]
},
"initialValue": {
"type": "number",
"minimum": 0
},
"monthlyContribution": {
"type": "number",
"minimum": 0
},
"annualReturn": {
"type": "number"
},
"annualFeeRate": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"horizons": {
"type": "array",
"items": {
"type": "object",
"properties": {
"years": {
"type": "integer",
"exclusiveMinimum": 0
},
"valueWithCost": {
"type": "number",
"minimum": 0
},
"valueWithoutCost": {
"type": "number",
"minimum": 0
},
"totalCostDrag": {
"type": "number",
"minimum": 0
},
"averageAnnualCostDrag": {
"type": "number",
"minimum": 0
},
"costDragFraction": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"years",
"valueWithCost",
"valueWithoutCost",
"totalCostDrag",
"averageAnnualCostDrag",
"costDragFraction"
],
"additionalProperties": false
}
}
},
"required": [
"model",
"initialValue",
"monthlyContribution",
"annualReturn",
"annualFeeRate",
"horizons"
],
"additionalProperties": false
}POST /api/v1/public/portfolio-analysis/industries
Расчёт и ограничения →{
"basis": "weights",
"baseCurrency": "EUR",
"holdings": [
{
"isin": "IE00B4L5Y983",
"weight": 0.6
},
{
"isin": "IE00B3XXRP09",
"weight": 0.3
},
{
"assetClass": "cash",
"currency": "EUR",
"weight": 0.1
}
],
"locale": "en"
}{
"anyOf": [
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"weights"
],
"default": "weights"
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"isin",
"weight"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"assetClass",
"currency",
"weight"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"holdings"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"values"
]
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"isin",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"assetClass",
"currency",
"value"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"basis",
"holdings"
],
"additionalProperties": false
}
]
}{
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"capability": {
"type": "string",
"enum": [
"industries"
]
},
"analysis": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"industries": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
},
"unknownWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"tailWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets",
"unknownWeight",
"tailWeight"
],
"additionalProperties": false
},
"industryInterests": {
"type": "object",
"properties": {
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"definitionVersion": {
"type": "integer",
"exclusiveMinimum": 0
},
"weight": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
}
},
"required": [
"key",
"definitionVersion",
"weight"
],
"additionalProperties": false
}
}
},
"required": [
"coverage",
"items"
],
"additionalProperties": false
},
"thematicBaskets": {
"type": "object",
"properties": {
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"definitionVersion": {
"type": "integer",
"exclusiveMinimum": 0
},
"weight": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
}
},
"required": [
"key",
"definitionVersion",
"weight"
],
"additionalProperties": false
}
},
"registryVersion": {
"type": "integer",
"exclusiveMinimum": 0
}
},
"required": [
"coverage",
"items",
"registryVersion"
],
"additionalProperties": false
},
"unresolvedPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"constituentsAsOf": {
"type": [
"string",
"null"
]
}
},
"required": [
"industries",
"industryInterests",
"thematicBaskets",
"unresolvedPortfolioWeight",
"constituentsAsOf"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"limitations": {
"type": "array",
"items": {
"type": "string"
}
},
"links": {
"type": "object",
"properties": {
"documentation": {
"type": "string",
"format": "uri"
},
"catalog": {
"type": "string",
"format": "uri"
}
},
"required": [
"documentation",
"catalog"
],
"additionalProperties": false
}
},
"required": [
"modelVersion",
"computedAt",
"baseCurrency",
"capability",
"analysis",
"assumptions",
"limitations",
"links"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"industries": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
},
"unknownWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"tailWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets",
"unknownWeight",
"tailWeight"
],
"additionalProperties": false
},
"industryInterests": {
"type": "object",
"properties": {
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"definitionVersion": {
"type": "integer",
"exclusiveMinimum": 0
},
"weight": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
}
},
"required": [
"key",
"definitionVersion",
"weight"
],
"additionalProperties": false
}
}
},
"required": [
"coverage",
"items"
],
"additionalProperties": false
},
"thematicBaskets": {
"type": "object",
"properties": {
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"definitionVersion": {
"type": "integer",
"exclusiveMinimum": 0
},
"weight": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
}
},
"required": [
"key",
"definitionVersion",
"weight"
],
"additionalProperties": false
}
},
"registryVersion": {
"type": "integer",
"exclusiveMinimum": 0
}
},
"required": [
"coverage",
"items",
"registryVersion"
],
"additionalProperties": false
},
"unresolvedPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"constituentsAsOf": {
"type": [
"string",
"null"
]
}
},
"required": [
"industries",
"industryInterests",
"thematicBaskets",
"unresolvedPortfolioWeight",
"constituentsAsOf"
],
"additionalProperties": false
}POST /api/v1/public/portfolio-analysis/revenue-geography
Расчёт и ограничения →{
"basis": "weights",
"baseCurrency": "EUR",
"holdings": [
{
"isin": "IE00B4L5Y983",
"weight": 0.6
},
{
"isin": "IE00B3XXRP09",
"weight": 0.3
},
{
"assetClass": "cash",
"currency": "EUR",
"weight": 0.1
}
],
"locale": "en"
}{
"anyOf": [
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"weights"
],
"default": "weights"
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"isin",
"weight"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"assetClass",
"currency",
"weight"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"holdings"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"values"
]
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"isin",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"assetClass",
"currency",
"value"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"basis",
"holdings"
],
"additionalProperties": false
}
]
}{
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"capability": {
"type": "string",
"enum": [
"revenue-geography"
]
},
"analysis": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"coveredPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"unknownWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"unresolvedPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
},
"companyLimit": {
"type": "integer",
"exclusiveMinimum": 0
},
"companiesExamined": {
"type": "integer",
"minimum": 0
},
"companiesCovered": {
"type": "integer",
"minimum": 0
},
"reportAsOf": {
"type": [
"string",
"null"
]
},
"constituentsAsOf": {
"type": [
"string",
"null"
]
},
"unmappedSegments": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"coveredPortfolioWeight",
"unknownWeight",
"unresolvedPortfolioWeight",
"buckets",
"companyLimit",
"companiesExamined",
"companiesCovered",
"reportAsOf",
"constituentsAsOf",
"unmappedSegments"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"limitations": {
"type": "array",
"items": {
"type": "string"
}
},
"links": {
"type": "object",
"properties": {
"documentation": {
"type": "string",
"format": "uri"
},
"catalog": {
"type": "string",
"format": "uri"
}
},
"required": [
"documentation",
"catalog"
],
"additionalProperties": false
}
},
"required": [
"modelVersion",
"computedAt",
"baseCurrency",
"capability",
"analysis",
"assumptions",
"limitations",
"links"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"coveredPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"unknownWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"unresolvedPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
},
"companyLimit": {
"type": "integer",
"exclusiveMinimum": 0
},
"companiesExamined": {
"type": "integer",
"minimum": 0
},
"companiesCovered": {
"type": "integer",
"minimum": 0
},
"reportAsOf": {
"type": [
"string",
"null"
]
},
"constituentsAsOf": {
"type": [
"string",
"null"
]
},
"unmappedSegments": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"coveredPortfolioWeight",
"unknownWeight",
"unresolvedPortfolioWeight",
"buckets",
"companyLimit",
"companiesExamined",
"companiesCovered",
"reportAsOf",
"constituentsAsOf",
"unmappedSegments"
],
"additionalProperties": false
}POST /api/v1/public/portfolio-analysis/compare
Расчёт и ограничения →{
"before": {
"basis": "weights",
"baseCurrency": "EUR",
"holdings": [
{
"isin": "IE00B4L5Y983",
"weight": 0.6
},
{
"isin": "IE00B3XXRP09",
"weight": 0.3
},
{
"assetClass": "cash",
"currency": "EUR",
"weight": 0.1
}
],
"locale": "en"
},
"after": {
"basis": "weights",
"baseCurrency": "EUR",
"holdings": [
{
"isin": "IE00B4L5Y983",
"weight": 0.8
},
{
"isin": "IE00B3XXRP09",
"weight": 0.1
},
{
"assetClass": "cash",
"currency": "EUR",
"weight": 0.1
}
],
"locale": "en"
}
}{
"type": "object",
"properties": {
"before": {
"anyOf": [
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"weights"
],
"default": "weights"
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"isin",
"weight"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"assetClass",
"currency",
"weight"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"holdings"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"values"
]
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"isin",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"assetClass",
"currency",
"value"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"basis",
"holdings"
],
"additionalProperties": false
}
]
},
"after": {
"anyOf": [
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"weights"
],
"default": "weights"
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"isin",
"weight"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"assetClass",
"currency",
"weight"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"holdings"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"values"
]
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"isin",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"assetClass",
"currency",
"value"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"basis",
"holdings"
],
"additionalProperties": false
}
]
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
}
},
"required": [
"before",
"after"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"capability": {
"type": "string",
"enum": [
"compare"
]
},
"analysis": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"before": {
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"basis": {
"type": "string",
"enum": [
"weights",
"values"
]
},
"totalValue": {
"type": [
"number",
"null"
],
"minimum": 0
},
"resolvedPortfolioWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"constituentsAsOf": {
"type": [
"string",
"null"
],
"description": "Oldest known fund-constituent date; null when unavailable. Not the date of all reference data."
},
"holdings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0
},
"assetClass": {
"type": [
"string",
"null"
]
},
"status": {
"type": "string",
"enum": [
"resolved",
"unresolved"
]
}
},
"required": [
"isin",
"name",
"weight",
"value",
"assetClass",
"status"
],
"additionalProperties": false
}
},
"analyses": {
"type": "object",
"properties": {
"allocation": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"whole_portfolio"
]
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"overlap": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"method": {
"type": "string",
"enum": [
"sum_minimum_constituent_weights"
]
},
"fundCount": {
"type": "integer",
"minimum": 0
},
"pairs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fundA": {
"type": "string"
},
"fundB": {
"type": "string"
},
"isinA": {
"type": [
"string",
"null"
]
},
"isinB": {
"type": [
"string",
"null"
]
},
"overlap": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Sum of the smaller constituent weights in the two funds, not a percentage of the portfolio."
},
"sharedCount": {
"type": "integer",
"minimum": 0
},
"sharedTail": {
"type": [
"object",
"null"
],
"properties": {
"count": {
"type": "integer",
"minimum": 0
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"count",
"weight"
],
"additionalProperties": false,
"description": "Shared constituents beyond the returned list; weight uses the same overlap measure as the headline."
},
"sharedHoldings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"weightInA": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"weightInB": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"id",
"name",
"weightInA",
"weightInB"
],
"additionalProperties": false
}
}
},
"required": [
"fundA",
"fundB",
"isinA",
"isinB",
"overlap",
"sharedCount",
"sharedTail",
"sharedHoldings"
],
"additionalProperties": false
}
},
"funds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"full",
"partial",
"none"
]
},
"coveredWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"asOf": {
"type": [
"string",
"null"
]
}
},
"required": [
"isin",
"name",
"status",
"coveredWeight",
"asOf"
],
"additionalProperties": false
}
}
},
"required": [
"method",
"fundCount",
"pairs",
"funds"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"look-through": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"positions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0
},
"sector": {
"type": [
"string",
"null"
]
},
"region": {
"type": [
"string",
"null"
]
},
"provenance": {
"type": "object",
"properties": {
"direct": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"viaFunds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fund": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"shareInFund": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"fund",
"weight",
"shareInFund"
],
"additionalProperties": false
}
}
},
"required": [
"direct",
"viaFunds"
],
"additionalProperties": false
}
},
"required": [
"id",
"isin",
"name",
"weight",
"value",
"sector",
"region",
"provenance"
],
"additionalProperties": false
}
},
"positionCount": {
"type": "integer",
"minimum": 0
},
"unresolvedFundWeight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Whole-portfolio share in undissolved equity fund remainders; these are not named companies."
},
"tailWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"funds": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"full",
"partial",
"none"
]
},
"coveredWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"asOf": {
"type": [
"string",
"null"
]
}
},
"required": [
"isin",
"name",
"status",
"coveredWeight",
"asOf"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"positions",
"positionCount",
"unresolvedFundWeight",
"tailWeight",
"funds"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"concentration": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"issuers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"issuerId": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"issuerId",
"name",
"weight"
],
"additionalProperties": false
}
},
"issuerCount": {
"type": [
"integer",
"null"
],
"minimum": 0
},
"tailWeight": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"largestIssuer": {
"type": [
"object",
"null"
],
"properties": {
"issuerId": {
"type": "string"
},
"name": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"issuerId",
"name",
"weight"
],
"additionalProperties": false
},
"hhi": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1,
"description": "Herfindahl index over the equity issuer book; withheld below 80% coverage."
},
"effectiveN": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Effective issuer count; withheld below 80% coverage."
}
},
"required": [
"scope",
"coverage",
"issuers",
"issuerCount",
"tailWeight",
"largestIssuer",
"hhi",
"effectiveN"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"sectors": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"geography": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"countries": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
},
"regions": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
}
},
"required": [
"countries",
"regions"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"currencies": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable",
"not_requested"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"equityExposure": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"equities"
]
},
"portfolioShare": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Equity share of the entire submitted portfolio that this dimension evaluates."
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Classified share of this dimension's equity population."
},
"buckets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Share of the entire submitted portfolio, including unresolved holdings in the denominator."
},
"value": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Amount in baseCurrency; null for weight-only requests."
}
},
"required": [
"key",
"weight",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"scope",
"portfolioShare",
"coverage",
"buckets"
],
"additionalProperties": false
},
"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
Расчёт и ограничения →{
"portfolio": {
"basis": "values",
"baseCurrency": "EUR",
"holdings": [
{
"isin": "IE00B4L5Y983",
"value": 6000
},
{
"assetClass": "cash",
"currency": "EUR",
"value": 4000
}
]
},
"targets": [
{
"assetClass": "equities",
"weight": 0.8
},
{
"assetClass": "cash",
"weight": 0.2
}
],
"contribution": 1000,
"minimumAllocation": 0
}{
"type": "object",
"properties": {
"portfolio": {
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"values"
]
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"isin",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"assetClass",
"currency",
"value"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"basis",
"holdings"
],
"additionalProperties": false
},
"targets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"equities",
"bonds",
"cash",
"gold",
"crypto",
"real_estate",
"commodities",
"alternatives"
]
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"assetClass",
"weight"
],
"additionalProperties": false
},
"minItems": 1,
"maxItems": 8
},
"contribution": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"description": "One new contribution, in the portfolio's baseCurrency, in whole cents."
},
"minimumAllocation": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0
}
},
"required": [
"portfolio",
"targets",
"contribution"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"capability": {
"type": "string",
"enum": [
"contribution-plan"
]
},
"analysis": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"method": {
"type": "string",
"enum": [
"proportional_underweight_gaps"
]
},
"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
Расчёт и ограничения →{
"isin": "IE00B4L5Y983",
"candidateIsins": [
"IE00BK5BQT80"
],
"baseCurrency": "EUR",
"limit": 5
}{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"candidateIsins": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"minItems": 1,
"maxItems": 10,
"description": "Explicit candidate universe. When omitted, a bounded shared alternatives catalog of every listing venue is read; it may have no entries for this listing."
},
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 10,
"default": 5
}
},
"required": [
"isin"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"capability": {
"type": "string",
"enum": [
"etf-alternatives"
]
},
"analysis": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"model": {
"type": "string",
"enum": [
"half_holdings_quarter_sector_quarter_country"
]
},
"candidateSource": {
"type": "string",
"enum": [
"caller",
"shared_catalog"
]
},
"catalogAsOf": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"source": {
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"name": {
"type": "string"
},
"ter": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"constituentsAsOf": {
"type": [
"string",
"null"
]
},
"holdingsCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"sectorCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"countryCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"isin",
"name",
"ter",
"constituentsAsOf",
"holdingsCoverage",
"sectorCoverage",
"countryCoverage"
],
"additionalProperties": false
},
"candidates": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"name": {
"type": "string"
},
"ter": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"constituentsAsOf": {
"type": [
"string",
"null"
]
},
"holdingsCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"sectorCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"countryCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"status": {
"type": "string",
"enum": [
"ok",
"unavailable"
]
},
"reason": {
"type": [
"string",
"null"
],
"enum": [
"unresolved",
"not_equity_fund",
"missing_cost",
"incomplete_holdings",
"incomplete_vectors",
"provider_unavailable",
null
]
},
"holdingOverlap": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"sectorCosine": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"countryCosine": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"similarityScore": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"terSaving": {
"type": [
"number",
"null"
]
},
"qualifies": {
"type": "boolean"
}
},
"required": [
"isin",
"name",
"ter",
"constituentsAsOf",
"holdingsCoverage",
"sectorCoverage",
"countryCoverage",
"status",
"reason",
"holdingOverlap",
"sectorCosine",
"countryCosine",
"similarityScore",
"terSaving",
"qualifies"
],
"additionalProperties": false
},
"maxItems": 10
},
"matches": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
}
},
"omittedMatches": {
"type": "integer",
"minimum": 0
},
"failure": {
"type": [
"string",
"null"
],
"enum": [
"catalog_empty",
"catalog_unavailable",
"source_unavailable",
null
]
}
},
"required": [
"model",
"candidateSource",
"catalogAsOf",
"source",
"candidates",
"matches",
"omittedMatches",
"failure"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"limitations": {
"type": "array",
"items": {
"type": "string"
}
},
"links": {
"type": "object",
"properties": {
"documentation": {
"type": "string",
"format": "uri"
},
"catalog": {
"type": "string",
"format": "uri"
}
},
"required": [
"documentation",
"catalog"
],
"additionalProperties": false
}
},
"required": [
"modelVersion",
"computedAt",
"baseCurrency",
"capability",
"analysis",
"assumptions",
"limitations",
"links"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"model": {
"type": "string",
"enum": [
"half_holdings_quarter_sector_quarter_country"
]
},
"candidateSource": {
"type": "string",
"enum": [
"caller",
"shared_catalog"
]
},
"catalogAsOf": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"source": {
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"name": {
"type": "string"
},
"ter": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"constituentsAsOf": {
"type": [
"string",
"null"
]
},
"holdingsCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"sectorCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"countryCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"isin",
"name",
"ter",
"constituentsAsOf",
"holdingsCoverage",
"sectorCoverage",
"countryCoverage"
],
"additionalProperties": false
},
"candidates": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"name": {
"type": "string"
},
"ter": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"constituentsAsOf": {
"type": [
"string",
"null"
]
},
"holdingsCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"sectorCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"countryCoverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"status": {
"type": "string",
"enum": [
"ok",
"unavailable"
]
},
"reason": {
"type": [
"string",
"null"
],
"enum": [
"unresolved",
"not_equity_fund",
"missing_cost",
"incomplete_holdings",
"incomplete_vectors",
"provider_unavailable",
null
]
},
"holdingOverlap": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"sectorCosine": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"countryCosine": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"similarityScore": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1
},
"terSaving": {
"type": [
"number",
"null"
]
},
"qualifies": {
"type": "boolean"
}
},
"required": [
"isin",
"name",
"ter",
"constituentsAsOf",
"holdingsCoverage",
"sectorCoverage",
"countryCoverage",
"status",
"reason",
"holdingOverlap",
"sectorCosine",
"countryCosine",
"similarityScore",
"terSaving",
"qualifies"
],
"additionalProperties": false
},
"maxItems": 10
},
"matches": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
}
},
"omittedMatches": {
"type": "integer",
"minimum": 0
},
"failure": {
"type": [
"string",
"null"
],
"enum": [
"catalog_empty",
"catalog_unavailable",
"source_unavailable",
null
]
}
},
"required": [
"model",
"candidateSource",
"catalogAsOf",
"source",
"candidates",
"matches",
"omittedMatches",
"failure"
],
"additionalProperties": false
}POST /api/v1/public/portfolio-analysis/stress-scenarios
Расчёт и ограничения →[
{
"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": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"weights"
],
"default": "weights"
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"isin",
"weight"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"assetClass",
"currency",
"weight"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"holdings"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"values"
]
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"isin",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"assetClass",
"currency",
"value"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"basis",
"holdings"
],
"additionalProperties": false
}
]
},
"scenarioKeys": {
"type": "array",
"items": {
"type": "string",
"enum": [
"gfc_2008",
"covid_2020",
"rate_hike_2022",
"euro_crisis_2011",
"dotcom_2000"
]
},
"minItems": 1,
"maxItems": 5
}
},
"required": [
"portfolio",
"scenarioKeys"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"capability": {
"type": "string",
"enum": [
"stress-scenarios"
]
},
"analysis": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"model": {
"type": "string",
"enum": [
"approximate_sector_asset_class_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",
null
]
},
"returnFraction": {
"type": [
"number",
"null"
]
},
"preValue": {
"type": [
"number",
"null"
],
"minimum": 0
},
"postValue": {
"type": [
"number",
"null"
],
"minimum": 0
},
"change": {
"type": [
"number",
"null"
]
},
"approximate": {
"type": "boolean",
"enum": [
true
]
},
"methodology": {
"type": "string"
},
"sources": {
"type": "array",
"items": {
"type": "string"
},
"description": "Source descriptions including URLs, preserved from the maintained scenario registry."
},
"reviewedAt": {
"type": [
"string",
"null"
],
"format": "date"
},
"positions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
],
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"cashCurrency": {
"type": [
"string",
"null"
]
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"assetClass": {
"type": "string"
},
"returnFraction": {
"type": "number"
},
"fxShockApplied": {
"type": "number"
},
"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",
null
]
},
"returnFraction": {
"type": [
"number",
"null"
]
},
"preValue": {
"type": [
"number",
"null"
],
"minimum": 0
},
"postValue": {
"type": [
"number",
"null"
],
"minimum": 0
},
"change": {
"type": [
"number",
"null"
]
},
"approximate": {
"type": "boolean",
"enum": [
true
]
},
"methodology": {
"type": "string"
},
"sources": {
"type": "array",
"items": {
"type": "string"
},
"description": "Source descriptions including URLs, preserved from the maintained scenario registry."
},
"reviewedAt": {
"type": [
"string",
"null"
],
"format": "date"
},
"positions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isin": {
"type": [
"string",
"null"
],
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"cashCurrency": {
"type": [
"string",
"null"
]
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"assetClass": {
"type": "string"
},
"returnFraction": {
"type": "number"
},
"fxShockApplied": {
"type": "number"
},
"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
Расчёт и ограничения →{
"portfolio": {
"basis": "weights",
"baseCurrency": "EUR",
"holdings": [
{
"isin": "IE00B4L5Y983",
"weight": 0.6
},
{
"isin": "IE00B3XXRP09",
"weight": 0.3
},
{
"assetClass": "cash",
"currency": "EUR",
"weight": 0.1
}
],
"locale": "en"
},
"startDate": "2021-01-04",
"endDate": "2025-12-31",
"initialValue": 10000,
"monthlyContribution": 100,
"rebalancing": "annual"
}{
"type": "object",
"properties": {
"portfolio": {
"anyOf": [
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"weights"
],
"default": "weights"
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"isin",
"weight"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1,
"exclusiveMinimum": 0,
"description": "Share of the entire submitted portfolio: 0.6 means 60%."
}
},
"required": [
"assetClass",
"currency",
"weight"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"holdings"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"baseCurrency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"default": "EUR"
},
"locale": {
"type": "string",
"enum": [
"de",
"en",
"es",
"it",
"fr",
"nl",
"cs",
"pl",
"ru",
"uk"
],
"default": "en"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum returned companies and underlying positions; tails retain omitted weight."
},
"basis": {
"type": "string",
"enum": [
"values"
]
},
"holdings": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"isin": {
"type": "string",
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"isin",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"cash"
]
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Market value already converted to baseCurrency. Never a native-currency amount."
}
},
"required": [
"assetClass",
"currency",
"value"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 25
}
},
"required": [
"basis",
"holdings"
],
"additionalProperties": false
}
]
},
"startDate": {
"type": "string",
"format": "date"
},
"endDate": {
"type": "string",
"format": "date"
},
"initialValue": {
"type": "number",
"minimum": 0,
"exclusiveMinimum": 0,
"maximum": 100000000,
"description": "Explicit hypothetical initial investment in baseCurrency, independent of current portfolio values."
},
"monthlyContribution": {
"type": "number",
"minimum": 0,
"maximum": 100000000,
"default": 0,
"description": "Invested on day zero and monthly anniversaries, at the first available trading day at or after each anniversary."
},
"rebalancing": {
"type": "string",
"enum": [
"none",
"annual",
"quarterly"
],
"default": "none"
}
},
"required": [
"portfolio",
"startDate",
"endDate",
"initialValue"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"modelVersion": {
"type": "string"
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"baseCurrency": {
"type": "string"
},
"capability": {
"type": "string",
"enum": [
"historical-replay"
]
},
"analysis": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"ok",
"partial",
"unavailable"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string",
"enum": [
"unresolved_holdings",
"provider_unavailable",
"incomplete_coverage",
"no_equities",
"fewer_than_two_funds"
]
}
},
"data": {
"type": [
"object",
"null"
],
"properties": {
"model": {
"type": "string",
"enum": [
"historical_current_mix_with_hypothetical_contributions"
]
},
"requestedStart": {
"type": "string",
"format": "date"
},
"requestedEnd": {
"type": "string",
"format": "date"
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"failure": {
"type": [
"string",
"null"
],
"enum": [
"future_window",
"incomplete_portfolio",
"insufficient_history",
null
]
},
"legs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"isin": {
"type": [
"string",
"null"
],
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"status": {
"type": "string",
"enum": [
"included",
"unavailable"
]
},
"reason": {
"type": [
"string",
"null"
],
"enum": [
"unresolved",
"missing_currency",
"missing_history",
"missing_fx",
"insufficient_history",
"stale_history",
"invalid_history",
"provider_unavailable",
null
]
},
"basis": {
"type": [
"string",
"null"
],
"enum": [
"total",
"price",
"nominal_cash",
null
]
},
"quoteCurrency": {
"type": [
"string",
"null"
]
},
"firstDate": {
"type": [
"string",
"null"
],
"format": "date"
},
"lastDate": {
"type": [
"string",
"null"
],
"format": "date"
}
},
"required": [
"key",
"isin",
"weight",
"status",
"reason",
"basis",
"quoteCurrency",
"firstDate",
"lastDate"
],
"additionalProperties": false
}
},
"replay": {
"type": [
"object",
"null"
],
"properties": {
"startDate": {
"type": "string",
"format": "date"
},
"endDate": {
"type": "string",
"format": "date"
},
"mixTotalReturn": {
"type": "number"
},
"mixCagr": {
"type": [
"number",
"null"
]
},
"maxDrawdown": {
"type": "number"
},
"peakDate": {
"type": "string",
"format": "date"
},
"maxDrawdownDate": {
"type": "string",
"format": "date"
},
"recoveryDate": {
"type": [
"string",
"null"
],
"format": "date"
},
"totalContributed": {
"type": "number",
"minimum": 0
},
"endingValue": {
"type": "number",
"minimum": 0
},
"contributionTotalReturn": {
"type": "number"
},
"annualizedReturn": {
"type": [
"number",
"null"
]
},
"resetCount": {
"type": "integer",
"minimum": 0
},
"series": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date": {
"type": "string",
"format": "date"
},
"value": {
"type": "number",
"minimum": 0
}
},
"required": [
"date",
"value"
],
"additionalProperties": false
},
"maxItems": 3700
},
"attribution": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"startWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"endWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"legReturn": {
"type": "number"
},
"contributionToReturn": {
"type": "number"
}
},
"required": [
"key",
"startWeight",
"endWeight",
"legReturn",
"contributionToReturn"
],
"additionalProperties": false
}
}
},
"required": [
"startDate",
"endDate",
"mixTotalReturn",
"mixCagr",
"maxDrawdown",
"peakDate",
"maxDrawdownDate",
"recoveryDate",
"totalContributed",
"endingValue",
"contributionTotalReturn",
"annualizedReturn",
"resetCount",
"series",
"attribution"
],
"additionalProperties": false
}
},
"required": [
"model",
"requestedStart",
"requestedEnd",
"coverage",
"failure",
"legs",
"replay"
],
"additionalProperties": false
}
},
"required": [
"status",
"reasons",
"data"
],
"additionalProperties": false
},
"assumptions": {
"type": "array",
"items": {
"type": "string"
}
},
"limitations": {
"type": "array",
"items": {
"type": "string"
}
},
"links": {
"type": "object",
"properties": {
"documentation": {
"type": "string",
"format": "uri"
},
"catalog": {
"type": "string",
"format": "uri"
}
},
"required": [
"documentation",
"catalog"
],
"additionalProperties": false
}
},
"required": [
"modelVersion",
"computedAt",
"baseCurrency",
"capability",
"analysis",
"assumptions",
"limitations",
"links"
],
"additionalProperties": false
}{
"type": "object",
"properties": {
"model": {
"type": "string",
"enum": [
"historical_current_mix_with_hypothetical_contributions"
]
},
"requestedStart": {
"type": "string",
"format": "date"
},
"requestedEnd": {
"type": "string",
"format": "date"
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"failure": {
"type": [
"string",
"null"
],
"enum": [
"future_window",
"incomplete_portfolio",
"insufficient_history",
null
]
},
"legs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"isin": {
"type": [
"string",
"null"
],
"pattern": "^[A-Z]{2}[A-Z0-9]{9}[0-9]$"
},
"weight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"status": {
"type": "string",
"enum": [
"included",
"unavailable"
]
},
"reason": {
"type": [
"string",
"null"
],
"enum": [
"unresolved",
"missing_currency",
"missing_history",
"missing_fx",
"insufficient_history",
"stale_history",
"invalid_history",
"provider_unavailable",
null
]
},
"basis": {
"type": [
"string",
"null"
],
"enum": [
"total",
"price",
"nominal_cash",
null
]
},
"quoteCurrency": {
"type": [
"string",
"null"
]
},
"firstDate": {
"type": [
"string",
"null"
],
"format": "date"
},
"lastDate": {
"type": [
"string",
"null"
],
"format": "date"
}
},
"required": [
"key",
"isin",
"weight",
"status",
"reason",
"basis",
"quoteCurrency",
"firstDate",
"lastDate"
],
"additionalProperties": false
}
},
"replay": {
"type": [
"object",
"null"
],
"properties": {
"startDate": {
"type": "string",
"format": "date"
},
"endDate": {
"type": "string",
"format": "date"
},
"mixTotalReturn": {
"type": "number"
},
"mixCagr": {
"type": [
"number",
"null"
]
},
"maxDrawdown": {
"type": "number"
},
"peakDate": {
"type": "string",
"format": "date"
},
"maxDrawdownDate": {
"type": "string",
"format": "date"
},
"recoveryDate": {
"type": [
"string",
"null"
],
"format": "date"
},
"totalContributed": {
"type": "number",
"minimum": 0
},
"endingValue": {
"type": "number",
"minimum": 0
},
"contributionTotalReturn": {
"type": "number"
},
"annualizedReturn": {
"type": [
"number",
"null"
]
},
"resetCount": {
"type": "integer",
"minimum": 0
},
"series": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date": {
"type": "string",
"format": "date"
},
"value": {
"type": "number",
"minimum": 0
}
},
"required": [
"date",
"value"
],
"additionalProperties": false
},
"maxItems": 3700
},
"attribution": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"startWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"endWeight": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"legReturn": {
"type": "number"
},
"contributionToReturn": {
"type": "number"
}
},
"required": [
"key",
"startWeight",
"endWeight",
"legReturn",
"contributionToReturn"
],
"additionalProperties": false
}
}
},
"required": [
"startDate",
"endDate",
"mixTotalReturn",
"mixCagr",
"maxDrawdown",
"peakDate",
"maxDrawdownDate",
"recoveryDate",
"totalContributed",
"endingValue",
"contributionTotalReturn",
"annualizedReturn",
"resetCount",
"series",
"attribution"
],
"additionalProperties": false
}
},
"required": [
"model",
"requestedStart",
"requestedEnd",
"coverage",
"failure",
"legs",
"replay"
],
"additionalProperties": false
}Выбирайте калькулятор по вопросу. Прочитайте схемы ввода и результата, уточните существенные недостающие допущения и верните результат с ограничениями и ссылкой на сценарий.
Прочитать руководство агента в Markdown (на английском) →Оценить немецкий налог на доходы от капитала, продажу акций или прибыль фондов акций.
Перевести дивиденд до налогов в чистый доход с необязательными допущениями об удержании по стране.
Оценить авансовый налог на одну позицию фонда, удерживаемую полный год.
Сравнить смоделированный капитал накапливающих и распределяющих фондов.
Распределить годовой необлагаемый лимит сберегателя между строками брокеров, не более шести.
Рассчитать сценарий регулярных вложений в ETF с необязательным смоделированным налоговым изъятием.
Определить размер резервного фонда и смоделировать время накопления.
Оценить первоначальные собственные средства для недвижимости, затраты покупки и срок накопления.
Оценить разрыв государственной пенсии Германии и накопления для его покрытия.
Смоделировать снятия из портфеля, налог и исчерпание в пределах горизонта модели.
Оценить налог на дарение или распределить подарки по окнам необлагаемых лимитов без предыдущих подарков.
Рассчитать сценарий детского инвестиционного счета с моделируемыми опциями Kindergeld и NV.
Оценить цели Regular, Coast или Barista FIRE в сегодняшних евро.
Схемы результата описывают единицы и null по каждому полю. Null не означает ноль евро. asOf является датой отсчета, а не налоговым годом. Раскрывайте предполагаемую доходность и рассматривайте ее как допущение, а не прогноз.
POST /compare запускает от двух до десяти независимых сценариев одного калькулятора с общей датой отсчета и языком. Каждый ввод использует собственные значения по умолчанию и проверку; сценарии не наследуют значения друг друга. Уникальные ids и порядок запроса сохраняются. Каждый успешный сценарий включает собственную ссылку на браузер.
{
"calculator": "etf-sparplan",
"asOf": "2026-10-15",
"locale": "ru",
"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
}
}
]
}Проверьте data.summary и каждую запись data.scenarios. HTTP 200 может включать отдельные ошибки ввода: успешные записи содержат data и error: null; неуспешные содержат data: null и error. Неверная структура запроса возвращает HTTP 400; непредвиденная ошибка модели HTTP 500. Каждый сценарий расходует одну единицу общего лимита частоты.
Простые параметры, например monthly_rate=500&years=20, сразу загружают калькулятор. Налоговые профили используют taxProfile.filing_status=joint; brokers является массивом JSON. Для отсутствующих полей применяются значения по умолчанию. Чтобы сохранить полный сценарий, используйте полученную ссылку или кнопку копирования калькулятора, включающую последующие изменения.
Открыть пример сценария →asOf и modelVersion сохраняют контекст. Старые ссылки с JSON сценария продолжают работать; не смешивайте форматы. Скопированные и полученные ссылки содержат исходные значения. Делитесь только тем, что можно видеть получателю.
Используйте data.links.calculator точно в полученном виде. Ссылка хранит проверенные исходные данные, версию модели и дату отсчета в читаемых параметрах запроса. Старые ссылки с JSON сценария поддерживаются. Калькулятор по ссылке загружает эти данные и остается редактируемым. Не восстанавливайте параметр по неполным данным.
Открыть калькулятор →Ссылки сохраняют исходные данные, а не старые исполняемые модели. Страница показывает уведомление, если сохраненная версия модели отличается от текущей. Для исторической записи храните полученный результат и modelVersion.
Ссылки на сценарии содержат исходные значения в URL. Делитесь только тем, что можно видеть получателю; используйте общие названия брокеров. Запросы не читают и не сохраняют данные аккаунта, а ответы расчетов используют Cache-Control: no-store. URL все же могут попадать в историю браузера или журналы инфраструктуры.
60 единиц на IP клиента в минуту суммарно для каталога, схем и расчетов. Обычный запрос стоит одну единицу; сравнение по одной за сценарий (от двух до десяти сценариев). Соблюдайте Retry-After в секундах. При недоступности Redis ограничение частоты действует по возможности. Тело запроса JSON ограничено 16 KiB. Междоменные запросы поддерживаются без учетных данных; в браузерных клиентах используйте credentials: omit.
Немецкие налоговые параметры являются допущениями модели, а не полной налоговой декларацией. Многолетние сценарии сохраняют текущие параметры неизменными и ежегодно возобновляют установленный законом необлагаемый лимит. Vorabpauschale API v1 охватывает одну позицию, удерживаемую полный год. Планирование дарения требует отсутствия предыдущих подарков. Режим Kindergeld использует фиксированное ежемесячное пособие модели вместо monthlyContribution. Читайте допущения и ограничения, возвращаемые каждым расчетом.
Для FIRE yearsToFire: null означает, что цель не достигнута в пределах горизонта модели. Для снятий yearsUntilDepletion: null означает отсутствие исчерпания в смоделированном горизонте; это не доказывает пожизненности снятий. Для целей накопления проверяйте targetUnreachable и deficit: ноль месяцев при нулевой возможности накопления не означает достижения непрофинансированной цели.