Endpoints
/v1/fund-fees
https://secfeedapi.com/v1/fund-feesFee tables for every series and share class: management fee, 12b-1, total and net expense ratios, sales charges, expense examples.
| Parameter | Type | Description | Example |
|---|---|---|---|
cikrequired | string | CIK of the registered fund trust (the registrant that files the prospectus). | 36405 |
ticker | string | Alternative to cik for listed tickers in the SEC's company ticker file. Mutual fund and ETF share class tickers are not resolved yet, so pass the trust's cik. | |
accessionNo | string | A specific 485BPOS, 485APOS, 497 or N-1A accession number with a risk/return fee table. | 0000036405-26-000181 |
- Without accessionNo the API walks back through the trust's ten most recent prospectus filings and uses the first one that carries fee data, because many 497 supplements have none.
- Ratios are decimals: 0.0014 means 0.14%. Expense examples are dollars per $10,000 invested.
- A trust files one table per prospectus, so seriesClass labels combine the prospectus, series and class XBRL members. Rows that only carry portfolioTurnover are series level rows.
Request examples
Every response below is real output from the API, trimmed to the first records.
Fee table of a large index fund trust
98 rows for this trust: one per prospectus, series and class combination, plus series level turnover rows.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/fund-fees?cik=36405"
import os, requests
r = requests.get(
"https://secfeedapi.com/v1/fund-fees",
params={'cik': '36405'},
headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
timeout=60,
)
r.raise_for_status()
print(r.json()){
"cik": 36405,
"accessionNo": "0000036405-26-000181",
"classes": [
{
"seriesClass": "InstitutionalSelectProspectusMember / S000002848Member / C000170276Member",
"managementFee": 0.0001,
"distribution12b1Fee": 0.0,
"otherExpenses": 0.0,
"totalAnnualExpenses": 0.0001,
"maxSalesCharge": 0.0,
"expenseExample1Yr": 1.0,
"expenseExample3Yr": 3.0,
"expenseExample5Yr": 6.0,
"expenseExample10Yr": 13.0
},
{
"seriesClass": "InvestorProspectusMember / S000002839Member / C000007773Member",
"managementFee": 0.0014,
"distribution12b1Fee": 0.0,
"otherExpenses": 0.0,
"totalAnnualExpenses": 0.0014,
"maxSalesCharge": 0.0,
"expenseExample1Yr": 14.0,
"expenseExample3Yr": 45.0,
"expenseExample5Yr": 79.0,
"expenseExample10Yr": 179.0
}
]
}A specific prospectus filing
Pin the result to one filing so it does not change when the trust files a new prospectus.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/fund-fees?cik=36405&accessionNo=0000036405-26-000181"
import os, requests
r = requests.get(
"https://secfeedapi.com/v1/fund-fees",
params={'cik': '36405', 'accessionNo': '0000036405-26-000181'},
headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
timeout=60,
)
r.raise_for_status()
print(r.json()){
"cik": 36405,
"accessionNo": "0000036405-26-000181",
"classes": [
{
"seriesClass": "InstitutionalSelectProspectusMember / S000002848Member / C000170276Member",
"managementFee": 0.0001,
"distribution12b1Fee": 0.0,
"otherExpenses": 0.0,
"totalAnnualExpenses": 0.0001,
"maxSalesCharge": 0.0,
"expenseExample1Yr": 1.0,
"expenseExample3Yr": 3.0,
"expenseExample5Yr": 6.0,
"expenseExample10Yr": 13.0
},
{
"seriesClass": "InvestorProspectusMember / S000002839Member / C000007773Member",
"managementFee": 0.0014,
"distribution12b1Fee": 0.0,
"otherExpenses": 0.0,
"totalAnnualExpenses": 0.0014,
"maxSalesCharge": 0.0,
"expenseExample1Yr": 14.0,
"expenseExample3Yr": 45.0,
"expenseExample5Yr": 79.0,
"expenseExample10Yr": 179.0
}
]
}Another fund trust
A smaller trust returns fewer rows: one per series and share class with fee data, plus series level turnover rows.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/fund-fees?cik=105563"
import os, requests
r = requests.get(
"https://secfeedapi.com/v1/fund-fees",
params={'cik': '105563'},
headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
timeout=60,
)
r.raise_for_status()
print(r.json()){
"cik": 105563,
"accessionNo": "0000105563-26-000101",
"classes": [
{
"seriesClass": "ETFProspectusMember / S000061301Member / C000198465Member",
"managementFee": 0.0009,
"distribution12b1Fee": 0.0,
"otherExpenses": 0.0004,
"totalAnnualExpenses": 0.0013,
"expenseExample1Yr": 13.0,
"expenseExample3Yr": 42.0,
"expenseExample5Yr": 73.0,
"expenseExample10Yr": 166.0
},
{
"seriesClass": "ETFProspectusMember / S000061302Member / C000198466Member",
"managementFee": 0.0011,
"distribution12b1Fee": 0.0,
"otherExpenses": 0.0002,
"totalAnnualExpenses": 0.0013,
"expenseExample1Yr": 13.0,
"expenseExample3Yr": 42.0,
"expenseExample5Yr": 73.0,
"expenseExample10Yr": 166.0
}
]
}Response fields
| Field | Type | Meaning |
|---|---|---|
cik | integer | Trust CIK. |
accessionNo | string | Accession number of the prospectus filing used. |
classes[].seriesClass | string | XBRL members identifying the prospectus, series (S...) and class (C...) the row belongs to, joined with slashes. |
classes[].managementFee | number | Management fee as a fraction of assets. |
classes[].distribution12b1Fee | number | Distribution and service (12b-1) fee. |
classes[].otherExpenses | number | Other expenses. |
classes[].acquiredFundFees | number | Acquired fund fees and expenses, when reported. |
classes[].totalAnnualExpenses | number | Total annual fund operating expenses before waivers. |
classes[].feeWaiver | number | Fee waiver or reimbursement, when reported (negative values reduce expenses). |
classes[].netExpenses | number | Net expenses after waivers, when reported. |
classes[].maxSalesCharge | number | Maximum front-end sales charge. |
classes[].maxDeferredSalesCharge | number | Maximum deferred sales charge, when reported. |
classes[].portfolioTurnover | number | Portfolio turnover rate for the series. |
classes[].expenseExample1Yr / 3Yr / 5Yr / 10Yr | number | Expense example in dollars on a $10,000 investment over 1, 3, 5 and 10 years. |
How to
How do I find a fund trust's CIK?
Use the CIK shown on the fund's prospectus filings (485BPOS, 497) or its EDGAR profile. Share class tickers are not mapped yet; /v1/entities confirms the trust name for a CIK.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/entities?cik=36405"
How do I get the expense ratio of one share class?
Find the row whose seriesClass contains the class id (C...) and read totalAnnualExpenses or netExpenses.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/fund-fees?cik=36405"
How do I convert the ratios to percentages?
Multiply by 100: 0.0014 is 0.14%.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/fund-fees?cik=36405"
How do I compare the cost of investing over ten years?
Use expenseExample10Yr, the cost in dollars on $10,000 under the prospectus assumptions.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/fund-fees?cik=36405"
Why do some rows only have portfolioTurnover?
Turnover is reported per series, not per class, so it sits on its own series level row.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/fund-fees?cik=36405"
How do I pin results to one prospectus?
Pass accessionNo. Without it the newest filing with fee data is used.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/fund-fees?cik=36405&accessionNo=0000036405-26-000181"
Why do I get a 400 for an operating company?
Only registered funds file risk/return fee tables. Operating companies have none.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/fund-fees?cik=36405"
Where are the fund's holdings?
Use the N-PORT API, which returns monthly portfolio holdings reports filed by fund trusts; filter by the trust's cik when its reports are in the parsed history.
curl -H "Authorization: Bearer $SECFEED_KEY" \ "https://secfeedapi.com/v1/n-port?size=1&fields=flat"
Errors
- 400 "no risk/return fee table in the recent prospectus filings" when none of the ten latest prospectus filings carries fee data (for example an operating company CIK).
- 400 "unknown ticker X" for an unknown ticker.
See also the error codes every endpoint shares.
Try it with your own key
500 free calls a month.