TDCC Distribution
Retrieve the periodic TDCC shareholding distribution of a given stock within a date range, including the number of shareholders, shares held, and proportion of TDCC-deposited shares for each holding range.
GET /ownership/tdcc-distribution/{symbol}
Version Note
Available since v2.4.0
Parameters
| Name | Type | Description |
|---|---|---|
symbol* | string | Stock symbol (e.g. 2330), path parameter |
from | string | Start date (format: yyyy-MM-dd); when both from and to are omitted, the latest period is returned |
to | string | End date (format: yyyy-MM-dd); when only one of from / to is provided, it is treated as a single-day query for that date |
sort | string | Sort by date, defaults to desc; asc is also supported |
Response
| Name | Type | Description |
|---|---|---|
type* | string | Security type |
exchange* | string | Exchange |
market* | string | Market |
symbol* | string | Stock symbol |
data* | object[] | One entry per period |
data.date* | string | Publication base date |
data.distributions* | object[] | Breakdown by holding range |
data.distributions.range* | string | Holding range (shares), 15 fixed ranges; also includes a "合計" (total) row, and some periods include a "異動" (adjustment) row |
data.distributions.holders* | number | Number of shareholders |
data.distributions.shares* | number | Shares held (shares) |
data.distributions.proportion* | number | Proportion of TDCC-deposited shares (percentage value, 84.67 means 84.67%) |
Data Notes
- Data source: Compiled from the TDCC shareholding distribution tables published by the Taiwan Depository & Clearing Corporation.
- Data frequency: Published once a week, with
datebeing the publication base date (usually Friday; may be earlier around holidays). Historical data before 2015-05-08 is monthly. - Historical coverage: From 2013-07-01, covering TWSE-listed, TPEx-listed, and emerging-market stocks.
- Single-day queries: Data only exists on publication base dates. When only one of
from/tois provided (treated as a single-day query) and that date is not a publication base date,data: []is returned. - Query range: The span between
fromandtomust be less than 1 year, otherwise400is returned. Invalid dates orfromlater thantoalso return400. - No data: For nonexistent symbols or ranges without data,
200withdata: []is returned (not404). In this casetype/exchange/marketare default values and do not reflect the symbol's actual attributes.
Example
- Python
- Node.js
- C#
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.tdcc_distribution(**{"symbol": "2330", "from": "2026-08-07", "to": "2026-08-07"})
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)
const { FubonSDK } = require('fubon-neo');
const sdk = new FubonSDK();
const accounts = sdk.login("Your ID", "Your Password", "Your Cert Path", "Your Cert Password");
sdk.initRealtime(); // Establish market data connection
const client = sdk.marketdata.restClient
client.stock.ownership.tdccDistribution({ symbol: '2330', from: '2026-08-07', to: '2026-08-07' })
.then(data => console.log(data));
using FubonNeo.Sdk;
using FugleMarketData.QueryModels.Stock.Ownership;
var sdk = new FubonSDK();
var result = sdk.Login("Your ID", "Your Password", "Your Cert Path", "Your Cert Password");
sdk.InitRealtime(); // Establish market data connection
var rest = sdk.MarketData.RestClient.Stock;
var tdccDistribution = await rest.Ownership.TdccDistribution("2330", new()
{
From = new DateTime(2026, 8, 7),
To = new DateTime(2026, 8, 7)
});
var tdccDistribution_cont = tdccDistribution.Content.ReadAsStringAsync().Result;
Console.WriteLine(tdccDistribution_cont);
Response Body (data for the 2026-08-07 period; one period consists of 15 fixed ranges, and this period also includes the "異動" (adjustment) and "合計" (total) rows):
{
"type": "EQUITY",
"exchange": "TWSE",
"market": "TSE",
"symbol": "2330",
"data": [
{
"date": "2026-08-07",
"distributions": [
{
"range": "1-999",
"holders": 2523071,
"shares": 293744991,
"proportion": 1.13
},
{
"range": "1000-5000",
"holders": 454920,
"shares": 869533934,
"proportion": 3.35
},
{
"range": "5001-10000",
"holders": 53011,
"shares": 379122752,
"proportion": 1.46
},
{
"range": "10001-15000",
"holders": 17491,
"shares": 214496406,
"proportion": 0.82
},
{
"range": "15001-20000",
"holders": 8096,
"shares": 142302572,
"proportion": 0.54
},
{
"range": "20001-30000",
"holders": 7803,
"shares": 190826713,
"proportion": 0.73
},
{
"range": "30001-40000",
"holders": 3686,
"shares": 127930452,
"proportion": 0.49
},
{
"range": "40001-50000",
"holders": 2048,
"shares": 92338466,
"proportion": 0.35
},
{
"range": "50001-100000",
"holders": 4123,
"shares": 288118496,
"proportion": 1.11
},
{
"range": "100001-200000",
"holders": 2053,
"shares": 288258115,
"proportion": 1.11
},
{
"range": "200001-400000",
"holders": 1314,
"shares": 368794003,
"proportion": 1.42
},
{
"range": "400001-600000",
"holders": 584,
"shares": 285446281,
"proportion": 1.1
},
{
"range": "600001-800000",
"holders": 353,
"shares": 246354564,
"proportion": 0.94
},
{
"range": "800001-1000000",
"holders": 208,
"shares": 186782272,
"proportion": 0.72
},
{
"range": "1000001以上",
"holders": 1475,
"shares": 21958321050,
"proportion": 84.67
},
{
"range": "異動",
"holders": 1,
"shares": 1000,
"proportion": 0
},
{
"range": "合計",
"holders": 3080236,
"shares": 25932370067,
"proportion": 100
}
]
}
]
}