Skip to main content

ETF Holdings

Retrieve the daily constituent list of a given ETF within a date range, including constituent symbol, name, holding quantity, weight, and change from the previous available data date.

GET /ownership/etf-holdings/{symbol}
Version Note

Available since v2.2.9

Parameters​

NameTypeDescription
symbol*stringETF symbol (e.g. 0050, 00981A), path parameter
fromstringStart date (format: yyyy-MM-dd), defaults to 30 days ago; the range up to to must be shorter than 1 year
tostringEnd date (format: yyyy-MM-dd), defaults to today
sortstringSort by date, defaults to desc; asc is also supported

Response​

NameTypeDescription
symbol*stringETF symbol
type*stringSecurity type
exchange*stringExchange
market*stringMarket
data*object[]Daily constituent data, one entry per date
data.date*stringDate
data.components*object[]Constituent list
data.components.symbol*stringConstituent symbol (overseas ETFs may return a foreign symbol, e.g. AAPL UQ)
data.components.namestringConstituent name
data.components.quantitynumberHolding quantity (shares)
data.components.weightnumberWeight (%)
data.components.quantityChangenumberChange in holding quantity from the previous available data date (omitted on the first available date)
data.components.weightChangenumberChange in weight from the previous available data date (omitted on the first available date)
Data Notes
  • Data source: Compiled from daily constituent disclosures published by each ETF's issuing investment trust company. For reference only — the actual holdings are subject to the disclosures published by each issuer / fund prospectus.
  • Query range: The range between from and to in a single query must be shorter than 1 year, otherwise 400 is returned; an invalid date format or from later than to also returns 400.
  • Historical coverage: Constituent data goes back to 2019; the actual start varies by each ETF's listing date and issuer disclosures. Trading days for which the issuer did not provide constituent data will not appear in the response data array — rely on the actual response.
  • Weight coverage: This data only covers the ETF's equity holdings, so weights do not necessarily sum to 100% (the remainder being cash, futures, bonds or undisclosed positions). Taiwan equity ETFs (passive or active) are usually close to 100%; overseas equity ETFs are mostly around 90%; balanced / multi-asset and leveraged ETFs only return the equity portion and may sum to only a few tens of percent; ETFs with no equity holdings (pure bond, futures, commodity, inverse, and some currency-hedged / foreign-currency share classes) return data: [].
  • Change fields: quantityChange / weightChange are calculated against "the ETF's previous date with constituent data," not guaranteed to be the previous trading day. These two fields are omitted on the ETF's first available data date.
  • No data: A non-ETF symbol, a non-existent symbol, or a range with no disclosures all return 200 with data: [] (not 404); in that case type / exchange / market are default values and do not reflect the symbol's actual attributes.

Example​

from fubon_neo.sdk import FubonSDK, Order

sdk = FubonSDK()

accounts = sdk.login("Your ID", "Your password", "Your cert path", "Your cert password")

sdk.init_realtime() # Establish market data connection

reststock = sdk.marketdata.rest_client.stock

## Version 2.2.6 and later using following Exception for error handling
from fubon_neo.sdk import FugleAPIError

try:
response = reststock.ownership.etf_holdings(**{"symbol": "0050", "from": "2026-07-09", "to": "2026-07-09"})
except FugleAPIError as e:
print(f"Error: {e}")
print("------------")
print(f"Status Code: {e.status_code}") # ex: 429
print(f"Response Text: {e.response_text}") # ex: {"statusCode":429,"message":"Rate limit exceeded"}

print(response)

Response Body (to save space, components only lists the top 3 constituents, truncated with ...; the actual response includes all constituents for the date. Example based on data as of the 2026-07-09 close; the default query range returns 21 trading days):

{
"symbol": "0050",
"type": "EQUITY",
"exchange": "TWSE",
"market": "TSE",
"data": [
{
"date": "2026-07-09",
"components": [
{
"symbol": "2330",
"name": "台積電",
"quantity": 530358242,
"weight": 58.82,
"quantityChange": 370562,
"weightChange": 0.17
},
{
"symbol": "2454",
"name": "聯發科",
"quantity": 32045645,
"weight": 5.76,
"quantityChange": 22388,
"weightChange": -0.09
},
{
"symbol": "2308",
"name": "台達電",
"quantity": 41931322,
"weight": 3.56,
"quantityChange": 29348,
"weightChange": -0.03
}
// ... remaining constituents omitted
]
}
// ... remaining trading days omitted
]
}