Home / Developers / Fund Fees API
API reference

Fund Fees API

Get the fee table of every fund series and share class in a fund trust's latest prospectus: management fee, 12b-1 fee, other expenses, total and net expense ratios, sales charges, portfolio turnover and the 1, 3, 5 and 10 year expense examples. The data comes from the risk/return XBRL attached to 485BPOS and 497 filings. Product overview →

Endpoints

/v1/fund-fees

GEThttps://secfeedapi.com/v1/fund-fees

Fee tables for every series and share class: management fee, 12b-1, total and net expense ratios, sales charges, expense examples.

ParameterTypeDescriptionExample
cikrequiredstringCIK of the registered fund trust (the registrant that files the prospectus).36405
tickerstringAlternative 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.
accessionNostringA specific 485BPOS, 485APOS, 497 or N-1A accession number with a risk/return fee table.0000036405-26-000181

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

FieldTypeMeaning
cikintegerTrust CIK.
accessionNostringAccession number of the prospectus filing used.
classes[].seriesClassstringXBRL members identifying the prospectus, series (S...) and class (C...) the row belongs to, joined with slashes.
classes[].managementFeenumberManagement fee as a fraction of assets.
classes[].distribution12b1FeenumberDistribution and service (12b-1) fee.
classes[].otherExpensesnumberOther expenses.
classes[].acquiredFundFeesnumberAcquired fund fees and expenses, when reported.
classes[].totalAnnualExpensesnumberTotal annual fund operating expenses before waivers.
classes[].feeWaivernumberFee waiver or reimbursement, when reported (negative values reduce expenses).
classes[].netExpensesnumberNet expenses after waivers, when reported.
classes[].maxSalesChargenumberMaximum front-end sales charge.
classes[].maxDeferredSalesChargenumberMaximum deferred sales charge, when reported.
classes[].portfolioTurnovernumberPortfolio turnover rate for the series.
classes[].expenseExample1Yr / 3Yr / 5Yr / 10YrnumberExpense 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

See also the error codes every endpoint shares.

Try it with your own key

500 free calls a month.

Get free API key →