Morningstar Scenario Analysis API
Stress-test portfolios against historical and hypothetical market scenarios using Morningstar risk engines.
Stress-test portfolios against historical and hypothetical market scenarios using Morningstar risk engines.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/morningstar-scenario-analysis-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
version: 1.0.0
title: Authorization Tokens Accounts Scenario Analysis API
description: 'Use the `oauth` endpoint to generate the secure, time-limited JSON Web Tokens (JWTs) used to authorize access to APIs and components.</br></br>
To request a token, click Authorize and enter the following credentials:
* Username - Your Client ID.
* Password - Your Client Secret.'
servers:
- url: https://www.us-api.morningstar.com/token
description: PROD US
- url: https://www.emea-api.morningstar.com/token
description: PROD EMEA
- url: https://www.apac-api.morningstar.com/token
description: PROD APAC
security:
- BasicAuth: []
tags:
- name: Scenario Analysis
paths:
/direct-web-services/v1/scenario-analysis/risk-models:
get:
summary: Get risk models
responses:
'200':
$ref: '#/components/responses/ResponseGetRiskModels'
'400':
$ref: '#/components/responses/ResponseBadRequest'
operationId: getRiskModels
tags:
- Scenario Analysis
description: Retrieves the list of available risk models. The response includes a risk model ID, which can be used to request the scenarios defined for that model.
/direct-web-services/v1/scenario-analysis/scenarios:
get:
summary: Get scenarios
parameters:
- name: riskModelId
in: query
description: Specifies the risk model to query.
required: true
schema:
type: string
examples:
riskModelIdExample1:
summary: Global Equity Proprietary Factor Model (USD)
value: morn-glb-eq-usd
- name: scenarioType
in: query
description: Specifies the scenario type to filter results by.
schema:
$ref: '#/components/schemas/InputScenarioType'
enum:
- HistoricalEvent
- MarketShock
responses:
'200':
$ref: '#/components/responses/ResponseGetScenarios'
'400':
$ref: '#/components/responses/ResponseBadRequest'
operationId: getScenarios
tags:
- Scenario Analysis
description: 'Retrieves the list of scenarios defined for the specified risk model. The `HistoricalEvent`scenario type is returned by default. Use the optional `scenarioType` query parameter to override the default setting and return a different scenario type.
The response includes a scenario ID, which can be used to calculate returns or generate portfolio and investment metrics based on the conditions defined for the scenario.'
/direct-web-services/v1/scenario-analysis/returns:
post:
summary: Calculate returns
responses:
'200':
$ref: '#/components/responses/ResponseCalculateReturn'
'400':
$ref: '#/components/responses/ResponseBadRequest'
operationId: calculateReturns
tags:
- Scenario Analysis
description: Calculates scenario returns for the specified investments and portfolios based on the conditions defined for one or more scenarios.
requestBody:
$ref: '#/components/requestBodies/RequestCalculateReturn'
/direct-web-services/v1/scenario-analysis/metrics:
post:
summary: Generate metrics
responses:
'200':
$ref: '#/components/responses/ResponseGenerateMetrics'
'400':
$ref: '#/components/responses/ResponseBadRequest'
operationId: generateMetrics
tags:
- Scenario Analysis
description: Generates performance metrics for the specified portfolios and investments based on the conditions defined for one or more scenarios. Supported metrics include Alpha, Return, Max Drawdown, Standard Deviation, and Tracking Error.
requestBody:
$ref: '#/components/requestBodies/RequestGenerateMetrics'
/scenario-analysis/scenarios:
get:
responses:
'200':
description: OK
'401':
description: Authentication required.
'403':
description: You do not have access permission..
'404':
description: Not found.
'500':
description: Internal server error.
summary: Get all predefined scenarios
description: Get a list of all predefined scenarios. The response will include the unique ID for each scenario. You use the ID with other endpoints to return information based on that scenario. Only scenarios that your account is enabled for will be returned.
operationId: get_scenarios
parameters:
- in: query
description: Unique identifier of a risk model
name: risk-model-id
schema:
type: string
default: morn-glb-eq-usd
tags:
- Scenario Analysis
/scenario-analysis/calculate-cumulative-return:
post:
responses:
'200':
description: OK
'401':
description: Authentication required.
'403':
description: You do not have access permission.
'404':
description: Not found.
'500':
description: Internal server error.
summary: Calculate cumulative returns forecast for funds based on predefined or custom macro schock scenarios
description: Based on a specific risk model and predefined or custom macro shock scenarios, calculate daily cumulative returns forecast for funds. You can include multiple scenarios and one fund in the request, or one scenario and multiple funds. Multiple scenarios and multiple funds cannot be sent in the same request. The response enables you to understand the impact on fund cumulative returns if significant market events are repeated.
operationId: post_cumulative
requestBody:
$ref: '#/components/requestBodies/ScenarioAnalysisModel'
tags:
- Scenario Analysis
/scenario-analysis/calculate-drawdown:
post:
responses:
'200':
description: OK
'401':
description: Authentication required.
'403':
description: You do not have access permission..
'404':
description: Not found.
'500':
description: Internal server error.
summary: Calculate drawdown forecast for a fund based on a predefined or custom macro shock scenarios
description: Based on a specific risk model and predefined or custom macro shock scenarios, calculate daily drawdown forecast for a fund. You can include multiple scenarios and one fund in the request, or one scenario and multiple funds. Multiple scenarios and multiple funds cannot be sent in the same request. The response enables you to understand the impact on the fund drawdown if significant market events are repeated.
operationId: post_drawdown
requestBody:
$ref: '#/components/requestBodies/ScenarioAnalysisModel'
tags:
- Scenario Analysis
/scenario-analysis/calculate-metrics:
post:
responses:
'200':
description: OK
'401':
description: Authentication required.
'403':
description: You do not have access permission..
'404':
description: Not found.
'500':
description: Internal server error.
summary: Calculate metrics forecast for a fund based on predefined or custom macro shock scenarios
description: Based on a specific risk model and predefined or custom macro shock scenarios, calculate metrics forecast for a fund. You can include multiple scenarios and one fund in the request, or one scenario and multiple funds. Multiple scenarios and multiple funds cannot be sent in the same request. The response enables you to understand the impact on the fund metrics if significant market events are repeated.
operationId: post_metrics
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Metrics'
required: true
tags:
- Scenario Analysis
/scenario-analysis/calculate-period-return:
post:
responses:
'200':
description: OK
'401':
description: Authentication required.
'403':
description: You do not have access permission..
'404':
description: Not found.
'500':
description: Internal server error.
summary: Calculate returns forecast for a fund based on predefined or custom macro shock scenarios
description: Based on a specific risk model and predefined or custom macro shock scenarios, calculate returns for a fund during different time periods. You can include multiple scenarios and one fund in the request, or one scenario and multiple funds. Multiple scenarios and multiple funds cannot be sent in the same request. The response enables you to understand the impact on fund returns if significant market events are repeated.
operationId: post_period_return
requestBody:
$ref: '#/components/requestBodies/ScenarioAnalysisModel'
tags:
- Scenario Analysis
/scenario-analysis/calculate-ten-k-growth:
post:
responses:
'200':
description: OK
'401':
description: Authentication required.
'403':
description: You do not have access permission..
'404':
description: Not found.
'500':
description: Internal server error.
summary: Calculate growth forecast for a $10k investment in a fund based on a predefined or custom macro/market shock scenarios
description: Based on a specific risk model and predefined or custom macro/market shock scenarios, calculate growth for a $10k investment in a fund. You can include multiple scenarios and one fund in the request, or one scenario and multiple funds. Multiple scenarios and multiple funds cannot be sent in the same request. The response returns a series investment results forecasts. The forecast frequency depends on the type of scenario - predefined (daily); macro shock (monthly) market shock (weekly).
operationId: post_ten_k_growth
requestBody:
$ref: '#/components/requestBodies/ScenarioAnalysisModel'
tags:
- Scenario Analysis
components:
schemas:
InputInvestment:
required:
- id
type: object
properties:
id:
minLength: 1
type: string
description: Unique identifier of an investment.
idType:
type:
- string
- 'null'
description: Identifier type.
default: PerformanceId
baseCurrency:
type:
- string
- 'null'
description: Base currency to use for investment lookup. Accepts 3‑character ISO 4217 currency codes.
domicile:
type:
- string
- 'null'
description: Domicile to use for investment lookup. Accepts 3-character ISO 3166-1 country codes.
exchangeCountry:
type:
- string
- 'null'
description: Exchange country to use for investment lookup. Accepts 3-character ISO 3166-1 country codes.
exchangeId:
type:
- string
- 'null'
description: Exchange identifier to use for investment lookup. See [Exchange IDs](https://developer.morningstar.com/content/hidden-from-navigation/DwsApisExchangeIds.xlsx) document for list of valid values.
examples:
exchangeIdExample1:
summary: NASDAQ - ALL Markets (NAS)
value: EX$$$$XNAS
exchangeIdExample2:
summary: London Stock Exchange (LSE)
value: EX$$$$XLON
additionalProperties: false
ResponseGetScenarios:
type: object
properties:
scenarios:
type:
- array
- 'null'
items:
$ref: '#/components/schemas/OutputScenario'
scenarioType:
type:
- string
- 'null'
description: '
ScenarioType.'
scenarioTypeName:
type:
- string
- 'null'
description: '
ScenarioTypeName.'
metadata:
$ref: '#/components/schemas/OutputMetadata'
additionalProperties: false
InputScenarioType:
enum:
- HistoricalEvent
- MacroShock
- MarketShock
type: string
OutputMetricsPortfolio:
type: object
properties:
name:
type:
- string
- 'null'
description: '
Portfolio Id.'
performanceMetrics:
$ref: '#/components/schemas/OutputPerformanceMetrics'
assetCoverage:
type: integer
description: '
The holding weighted percentage of the applicable holdings for which a data point has been successfully calculated out of all the applicable holdings.'
format: int32
additionalProperties: false
OutputIdentifierType:
enum:
- SecurityId
- CUSIP
- TradingSymbol
- FundCode
- ISIN
- PerformanceId
- MSID
- SEDOL
- Ticker
type: string
description: Security identifier type
OutputInvestmentMetadata:
type: object
properties:
id:
type:
- string
- 'null'
description: ID passed in request.
idType:
type:
- string
- 'null'
description: '
ID type passed in request.
IdType value(s) - "ISIN", "CUSIP", "PerformanceId", "SecurityId", "TradingSymbol", "FundCode", "MSID"'
performanceId:
type:
- string
- 'null'
description: Performance ID (if not passed in request).
companyId:
type:
- string
- 'null'
description: Company ID (if not passed in request).
baseCurrency:
type:
- string
- 'null'
description: Input base currency used to look up Investment identifier
domicile:
type:
- string
- 'null'
description: Input domicile used to look up Investment identifier.
exchangeCountry:
type:
- string
- 'null'
description: Input exchange country used to look up Investment identifier.
exchangeId:
type:
- string
- 'null'
description: Input exchange id used to look up Investment identifier.
additionalProperties: false
description: Represents an investment that is considered invalid.
ResponseErrorDetails:
type: object
properties:
statusCode:
type: integer
description: Status Code
format: int32
errorCode:
type:
- string
- 'null'
description: Custom error code
message:
type:
- string
- 'null'
description: Message
requestId:
type:
- string
- 'null'
description: RequestId
additionalProperties: false
description: Error details
OutputSecurityType:
type: string
description: The security type
enum:
- BD
- BK
- CA
- CASH
- CIT
- CP
- CT
- CU
- CZ
- DF
- EI
- FC
- FE
- FG
- FH
- FI
- FM
- FO
- FV
- GA
- H1
- HD
- IF
- LP
- MG
- MO
- P1
- PI
- PO
- PS
- R1
- S1
- SA
- SC
- SP
- ST
- V1
- VA
- VH
- VL
- VP
- VS
- XI
x-enumDescriptions:
BD: Bonds
BK: 529 Benchmark
CA: Category Average/SectorAverages
CASH: Cash
CIT: Collective Investment Trusts
CP: College Saving Plans
CT: College Saving Portfolios
CU: Exchange Rates/Currency Exchange
CZ: Collective Investment Trusts
DF: Restricted Investors
EI: Economics Series
FC: Closed End Funds
FE: Exchange Traded Funds
FG: FG
FH: Hedge Funds
FI: Unit Investment Trust
FM: Money Market Funds
FO: Open End Fund
FV: Insurance Product Fund
GA: GRPA
H1: HFR Hedge Fund
HD: Australian Hybrid
IF: IF
LP: US Variable Life
MG: Strategies
MO: Models
P1: UK Life and Pension Policies
PI: Special Pooled Funds for Unregistered VA
PO: MF Objective
PS: European Pension/Life Fund Wrappers
R1: Global Restricted Funds
S1: UBS Separate Accounts
SA: Separate Accounts
SC: Custom Fund
SP: Private Funds
ST: Stocks
V1: UK Life and Pension Funds
VA: US Variable Annuity Subaccounts
VH: VH
VL: US Variable Life Subaccounts/VL Subaccount
VP: US Variable Annuities/VA Policy
VS: VS
XI: Market Indexes
OutputReturnsInvestment:
type: object
properties:
identifiers:
$ref: '#/components/schemas/OutputIdentifiers'
returns:
type:
- array
- 'null'
items:
$ref: '#/components/schemas/OutputReturn'
description: '
Investment Returns.'
assetCoverage:
type: number
description: '
The holding weighted percentage of the applicable holdings for which a data point has been successfully calculated out of all the applicable holdings.'
format: double
metadata:
$ref: '#/components/schemas/OutputLookupFilters'
additionalProperties: false
OutputMetricsScenario:
type: object
properties:
id:
type:
- string
- 'null'
description: '
Scenario Id.'
name:
type:
- string
- 'null'
description: '
Scenario Name.'
definition:
type:
- string
- 'null'
description: '
Scenario Definition.'
shockDate:
type:
- string
- 'null'
description: '
"shockDate" indicates when the forecast of the scenario analysis would starts. It is the last month end of the risk premium data.'
duration:
type: integer
description: '
Scenario Duration.'
format: int32
durationUnit:
type:
- string
- 'null'
description: '
Scenario DurationUnit.'
investments:
type:
- array
- 'null'
items:
$ref: '#/components/schemas/OutputMetricsInvestment'
description: '
List of Investments.'
portfolios:
type:
- array
- 'null'
items:
$ref: '#/components/schemas/OutputMetricsPortfolio'
description: '
List of Portfolios.'
additionalProperties: false
OutputMessageType:
enum:
- Warning
- Error
type: string
description: MessageType
InputPortfolio:
required:
- holdings
- name
type: object
properties:
holdings:
type: array
items:
$ref: '#/components/schemas/InputHolding'
name:
type:
- string
- 'null'
description: Get or set portfolio name
additionalProperties: false
holding:
properties:
identifier:
type: string
weight:
type: number
type: object
InputHolding:
type: object
properties:
weight:
type:
- number
- 'null'
description: 'Get or set the Weight
1. min value = 0
2. max value = 100'
format: double
cusip:
type:
- string
- 'null'
description: Get or set the CUSIP
fundCode:
type:
- string
- 'null'
description: Get or set the FundCode
isin:
type:
- string
- 'null'
description: Get or set the ISIN
performanceId:
type:
- string
- 'null'
description: Get or set the PerformanceId
securityId:
type:
- string
- 'null'
description: Get or set the SecurityId
tradingSymbol:
type:
- string
- 'null'
description: Get or set the TradingSymbol
additionalProperties: false
ResponseGenerateMetrics:
type: object
properties:
scenarios:
type:
- array
- 'null'
items:
$ref: '#/components/schemas/OutputMetricsScenario'
metadata:
$ref: '#/components/schemas/OutputMetadata'
additionalProperties: false
OutputMessage:
type: object
properties:
investments:
type:
- array
- 'null'
items:
$ref: '#/components/schemas/OutputInvestmentMetadata'
description: List of invalid holdings.
portfolios:
type:
- array
- 'null'
items:
$ref: '#/components/schemas/OutputPortfolioMetadata'
type:
$ref: '#/components/schemas/OutputMessageType'
message:
type:
- string
- 'null'
description: Message text.
code:
type:
- string
- 'null'
description: Unique identifier of a message.
additionalProperties: false
OutputHoldingMetadata:
type: object
properties:
identifier:
type:
- string
- 'null'
identifierType:
$ref: '#/components/schemas/OutputIdentifierType'
baseCurrency:
type:
- string
- 'null'
exchangeCountry:
type:
- string
- 'null'
domicile:
type:
- string
- 'null'
additionalProperties: false
OutputReturn:
type: object
properties:
date:
type:
- string
- 'null'
description: '
Return Date.'
period:
type:
- string
- 'null'
description: '
Return Period.'
value:
type: number
description: '
Return Value.'
format: double
additionalProperties: false
OutputLookupFilters:
type: object
properties:
baseCurrency:
type:
- string
- 'null'
description: Input base currency used to look up Investment identifier
domicile:
type:
- string
- 'null'
description: Input domicile used to look up Investment identifier.
exchangeCountry:
type:
- string
- 'null'
description: Input exchange country used to look up Investment identifier.
exchangeId:
type:
- string
- 'null'
description: Input exchange id used to look up Investment identifier.
additionalProperties: false
description: Information passed in request and used to look up an investment's Morningstar Investment identifier.
OutputReturnsScenario:
type: object
properties:
id:
type:
- string
- 'null'
description: Unique identifier of scenario applied in this calculation.
name:
type:
- string
- 'null'
description: Display name of scenario applied in this calculation.
definition:
type:
- string
- 'null'
description: Specification of the scenario — the market conditions applied in this calculation, such as the index, shock magnitude, and duration.
calculateType:
type:
- string
- 'null'
description: Type of calculation performed for this scenario.
shockDate:
type: string
description: Date on which the scenario analysis forecast begins. This is the last month end of the risk premium data.
format: date
duration:
type: integer
description: Length of the scenario forecast, beginning at `shockDate`. Expressed in the unit given by `durationUnit`.
format: int32
durationUnit:
type:
- string
- 'null'
description: Unit of time in which `duration` is expressed.
investments:
type:
- array
- 'null'
items:
$ref: '#/components/schemas/OutputReturnsInvestment'
description: Forecast results for each investment included in the request, calculated under this scenario.
portfolios:
type:
- array
- 'null'
items:
$ref: '#/components/schemas/OutputReturnsPortfolio'
description: Forecast results for each portfolio included in the request, calculated under this scenario.
additionalProperties: false
OutputRiskModel:
type: object
properties:
id:
type:
- string
- 'null'
description: Unique identifier of a risk model.
name:
type:
- string
- 'null'
description: Display name of the risk model.
legacyIds:
type:
- array
- 'null'
items:
type: string
description: Identifiers previously used for this risk model, retained so that requests issued against earlier versions of the API continue to resolve.
currencyId:
type:
- string
- 'null'
description: Currency ID.
currency:
type:
- string
- 'null'
description: Currency in which the risk model's results are expressed.
defaultGroup:
type:
- string
- 'null'
description: Default risk model group.
isPrimary:
type: boolean
asset:
type:
- string
- 'null'
description: Asset class covered by the risk model.
factorCount:
type: integer
format: int32
description: Number of risk factors in the model.
startDate:
type:
- string
- 'null'
description: Earliest date for which the risk model has data available. Analysis cannot begin before this date.
asOfDate:
type:
- string
- 'null'
description: Most recent date for which the risk model has data available.
description:
type:
- string
- 'null'
description: Description of the risk model.
currencyDescription:
type:
- string
- 'null'
description: Provides information about the currencies supported by the model. The `currency` field displays the default currency configured for the account.
factorDescription:
type:
- string
- 'null'
description: Description of the risk factors used by the model.
dataAvailability:
type:
- string
- 'null'
description: Range of dates for which the risk model has data available, bounded by `startDate` and `asOfDate`.
additionalProperties: false
OutputIdentifiers:
type: object
properties:
performanceId:
type:
- string
- 'null'
description: Performance ID passed in the request or returned based on the values passed to identify an investment.
securityId:
type:
- string
- 'null'
description: Morningstar security ID passed in the request used to look up investment identifiers.
tradingSymbol:
type:
- string
- 'null'
description: Trading symbol passed in the request used to look up investment identifiers.
fundCode:
type:
- string
- 'null'
description: Fund code passed in the request used to look up investment identifiers.
isin:
type:
- string
- 'null'
description: ISIN passed in the request and used to look up investment identifiers.
cusip:
type:
- string
- 'null'
description: CUSIP passed in the request used to look up investment identifiers.
additionalProperties: false
description: The ID and ID type passed in the request and the corresponding Morningstar investment identifiers are returned.
OutputInvestmentReference:
type: object
properties:
performanceId:
type:
- string
- 'null'
description: Morningstar Performance ID for the holding.
securityId:
type:
- string
- 'null'
description: Morningstar Security ID for the holding.
isin:
type:
- string
- 'null'
description: ISIN for the holding. Only present when the original request used ISIN as the identifier type.
tradingSymbol:
type:
- string
- 'null'
description: Trading symbol for the holding.
fundCode:
type:
- string
- 'null'
description: Fund code passed in the request used to look up investment identifiers.
cusip:
type:
- string
- 'null'
description: CUSIP passed in the request used to look up investment identifiers.
name:
type:
- string
- 'null'
description: Name of the investment.
baseCurrency:
type:
- string
- 'null'
description: BaseCurrency of the investment.
type:
type:
- string
- 'null'
description: Type of the investment.
$ref: '#/components/schemas/OutputSecurityType'
inceptionDate:
type:
- string
- 'null'
description: InceptionDate of the investment.
additionalProperties: false
description: Represents resolved identifier data for a valid investment or holding, returned in metadata.
ResponseGetRiskModels:
type: object
properties:
riskModels:
type:
- array
- 'null'
items:
$ref: '#/components/schemas/OutputRiskModel'
metadata:
$ref: '#/components/schemas/OutputMetadata'
additionalProperties: false
InputCalculationType:
enum:
- Cumulative
- Drawdown
- Growth10k
- Monthly
- Period
type: string
description: '
CalculationType defines the type of return in response.
Growth10k : A different way of showing cumulative return that highlights the change in value of an initial $10,000 investment
period : Calculate the forecast returns of the scenario for different periods of 1 week, 1 month etc.
cumulative : Cumulated returns.
drawdown : Drawdown of the return which is a measure of decline in an investment or fund from its peak to its trough over a period from the starting date.
monthly : Calculate the forecast returns of the scenario in monthly'
ScenarioAnalysisModel:
required:
- riskModelId
- scenarios
properties:
riskModelId:
type: string
example: morn-glb-eq-usd
investments:
type: array
description: Investment id refers to performance ids, identifying the funds to be analysis on, separated by "," when passing multiple.
example:
- id: 0P0000058R
type: PerformanceId
items:
$ref: '#/components/schemas/investment'
scenarios:
type: array
description: Scenario id, internal pre-defined scenario identities(scenario001 ~ scenario009), separated by "," when passing
# --- truncated at 32 KB (70 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/morningstar/refs/heads/main/openapi/morningstar-scenario-analysis-api-openapi.yml