Morningstar holdings
A fund's or ETF's holdings on Morningstar, largest first, 100 a page: name, ticker, ISIN, CUSIP, type, sector, country, weight, shares, share change and market value; with the portfolio date, holding counts, top 10 weight, turnover and benchmark, and (first page) the sector breakdown against the category and index and the country weights of the listed holdings.
Every response includes credits_used: the credits this call cost.
Parameters
| name | type | description |
|---|---|---|
tickerrequired | string | Fund or ETF ticker. Example: SPY |
type | fund | etf | fund or etf. Default: ETF first, then mutual fund. Example: etf |
exchange | string | Morningstar market code. Default xnas for funds; arcx, xnas, bats, then xnys for ETFs. |
page | integer | Page number (default 1), 100 holdings a page. next_page is null on the last page. Example: 1 |
Every endpoint also takes fresh, raw, fields (see lean responses and caching).
Example
curl "https://api.api.sh/morningstar/v1/holdings?ticker=SPY" \
-H "x-api-key: $APISH_KEY" import os, requests
res = requests.get(
"https://api.api.sh/morningstar/v1/holdings",
params={"ticker": "SPY"},
headers={"x-api-key": os.environ["APISH_KEY"]},
timeout=120,
)
res.raise_for_status()
data = res.json() const url = new URL("https://api.api.sh/morningstar/v1/holdings");
url.searchParams.set("ticker", "SPY");
const res = await fetch(url, { headers: { "x-api-key": process.env.APISH_KEY } });
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json(); Response
A JSON object with the fields described above, plus raw (the source's own data), cached, fetched_at and credits_used. Errors return {"success": false, "error": "…"} with the HTTP status (see errors). A lookup that ran but found nothing (404) costs the price above; refused calls and errors on our side are free (what's charged).