Investment Details Feed API

Get detailed profile data for up to 250 investments in a single request, drawing on Morningstar's fundamental, reference, and historical data..

Retrieve Results

When you submit a request, the API processes it as a job. This page explains how to check the job, retrieve the results when they are ready, and read the response.

Check the Job

The 202 response to your request contains a link for checking the job.

"_links": {
  "href": "https://www.us-api.morningstar.com/dynamic-services-apis/jobs/16bf1a7a-c883-4424-8810-2f4e9d244d40",
  "rel": "status",
  "method": "GET"
}

Call the link with your access token until the job is complete.

curl --request GET \
  --url "https://www.us-api.morningstar.com/dynamic-services-apis/jobs/16bf1a7a-c883-4424-8810-2f4e9d244d40" \
  --header "Authorization: Bearer {token}"

Don't call the link continuously. Wait between calls, and stop when the job is complete.

Retrieve the Results

When the job is complete, use its result ID to retrieve the results.

GET /direct-web-services/v1/investments/result/{resultId}

The following request retrieves the results.

curl --request GET \
  --url "https://www.us-api.morningstar.com/direct-web-services/v1/investments/result/{resultId}" \
  --header "accept: application/json" \
  --header "Authorization: Bearer {token}"

Use the base URL for your region, as described in Getting Started. The request takes no query parameters or body.

Read the Response

The response has two top-level properties.

PropertyDescription
investmentsAn array with one object for each investment that returned data.
metadataInformation about the response: the request ID, the time, and any messages.

The following response is for a request for the enterprise value and profitability data of one investment.

{
  "investments": [
    {
      "identifiers": {
        "performanceId": "0P00000046"
      },
      "enterpriseValueCalculations": [
        {
          "asOfDate": "2025-09-03",
          "analystNormalizedEnterpriseValueToEbitdaRatio": 21.70188,
          "analystNormalizedEnterpriseValueToEbitRatio": 61.69785
        }
      ],
      "profitability": [
        {
          "reportPeriodEndDate": "2025-03-31",
          "analystNormalizedEbit": 10914000,
          "analystNormalizedEbitda": 50354000,
          "currencyCode": {
            "value": "US Dollar",
            "code": "USD"
          }
        }
      ]
    }
  ],
  "metadata": {
    "requestId": "7ccd91c0-6146-4256-8aba-3a1f2e5d0203",
    "time": "2025-11-08T13:18:30.5777168Z"
  }
}

The example is shortened. A real response has all the data points in the views you requested.

Investments

Each object in investments is one investment. It has the following characteristics.

  • Identifiers. The identifiers object holds the investment's performance ID. Use it to match the data to the investments in your request.
  • Data groups. The remaining properties are data groups, named for the data they hold, such as profitability and trailingReturn. The groups depend on the views you requested.
  • Objects and arrays. A group is an object when there is one record, and an array when there can be several, such as time series values or several reporting periods. In the example above, profitability is an array.
  • Coded values. Some values are returned as an object with a value and a code, for example { "value": "US Dollar", "code": "USD" }.
  • Language and country. Data that depends on language or country uses the languageId and countryId from your request.

Check Metadata and Warnings

The metadata object has the following properties.

PropertyDescription
requestIdThe unique identifier of the request. Include it if you contact support.
timeThe time of the response.
messagesMessages about investments or data points that couldn't be returned. Present only when there are messages.
portfolioDateThe portfolio date, for the portfolio holdings views.
portfolioCurrencyThe portfolio currency, for the portfolio holdings views.

A successful response doesn't guarantee that every investment returned data. Check messages in every response. Each message has the following properties.

PropertyDescription
typeThe type of message.
codeThe message code.
messageA description of the issue.
investmentsThe investments the message applies to.

Each object in investments can have the following properties.

PropertyDescription
id and idTypeThe identifier and identifier type from your request.
statusA description of what couldn't be returned for the investment.
datapointIdThe data points that couldn't be returned.
errorCodeThe error code for the message.
performanceId and companyIdThe performance ID and company ID, if you didn't pass them in the request.
baseCurrency, domicile, exchangeCountry, exchangeIdThe lookup details from your request.

If an identifier couldn't be matched, check it for typos, check that idType matches it, and check the lookup details. If you aren't entitled to a data point, contact your Morningstar account manager.

Handle Errors

A request that fails returns an error response instead of results.

PropertyDescription
statusCodeThe HTTP status code.
errorCodeA unique identifier for the error.
messageA description of the problem.
requestIdThe unique identifier of the request.
StatusDescription
200The results are returned. Check metadata.messages.
400The request is invalid. Read the message to find the problem.
413The response payload is too large (413.investmentDetailsAsync.005).
500An internal server error occurred. Retry the request, and contact support if it persists.
503An upstream service is temporarily unavailable (503.investmentDetailsAsync.040). Retry later.

If the response payload is too large, split the request into smaller requests, with fewer investments or a shorter date range.

For the meaning of each error code, see Error Messages. For help with common problems, see Troubleshooting.

Next Steps