Home / Developers / N-PORT Holdings API
API reference

N-PORT Holdings API

Monthly portfolio reports from registered funds (Form N-PORT): fund totals, returns and flows, risk metrics and every holding with identifiers, value and asset category, as JSON. Product overview →

Endpoints

/v1/n-port

GEThttps://secfeedapi.com/v1/n-port

Fund portfolio holdings (N-PORT, every field).

ParameterTypeDescriptionExample
cikintegerRegistrant (trust) CIK.311101
startDatestringEarliest filing date.2026-10-01
endDatestringLatest filing date.2026-10-09
formTypestringNPORT-P or NPORT-P/A.NPORT-P/A
data.<path>stringExact match on any value in the filing, for example a series ID.data.primary_doc.formData.genInfo.seriesId=S000012004
fieldsstringflat drops the data object. N-PORT has no flat fields, so this leaves only the filing header.flat
fromintegerOffset. Default 0.20
sizeintegerUp to 100. Default 20.20

Request examples

Every response below is real output from the API, trimmed to the first records.

Reports filed this month

genInfo names the series; invstOrSecs.invstOrSec lists the holdings.

curl -H "Authorization: Bearer $SECFEED_KEY" \
  "https://secfeedapi.com/v1/n-port?startDate=2026-10-01&size=2"
import os, requests

r = requests.get(
    "https://secfeedapi.com/v1/n-port",
    params={'startDate': '2026-10-01', 'size': '2'},
    headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
    timeout=60,
)
r.raise_for_status()
print(r.json())
{
  "total": 41,
  "filings": [
    {
      "accessionNo": "0001193125-26-420001",
      "formType": "NPORT-P",
      "filedAt": "2026-10-13",
      "cik": 311101,
      "companyName": "DUPREE MUTUAL FUNDS",
      "flat": null,
      "data": {
        "primary_doc": {
          "headerData": {
            "submissionType": "NPORT-P",
            "isConfidential": "false",
            "filerInfo": {
              "filer": {
                "issuerCredentials": {
                  "cik": "0000311101",
                  "ccc": "XXXXXXXX"
                }
              },
              "seriesClassInfo": {
                "seriesId": "S000012004",
                "classId": "C000032732"
              }
            }
          },
          "formData": {
            "genInfo": {
              "regName": "Dupree Mutual Funds",
              "regFileNumber": "811-02918",
              "regCik": "0000311101",
              "regLei": "549300S8YVGTJ1NMTW57",
              "regStreet1": "125 South Mill Street",
              "regStreet2": "Vine Center, Suite 100",
              "regCity": "Lexington",
              "regStateConditional": {
                "@regCountry": "US",
                "@regState": "US-KY",
                "#text": ""
              },
              "regZipOrPostalCode": "40507",
              "regPhone": "859-254-7741",
              "seriesName": "Tennessee Tax-Free Income Series",
              "seriesId": "S000012004",
              "seriesLei": "549300OJ7QYEHSBVZ852",
              "repPdEnd": "2027-06-30",
              "repPdDate": "2026-09-30",
              "isFinalFiling": "N"
            },
            "fundInfo": {
              "totAssets": "45144051.700000000000",
              "totLiabs": "412650.220000000000",
              "netAssets": "44731401.480000000000",
              "assetsAttrMiscSec": "0.000000000000",
              "assetsInvested": "0.000000000000",
              "amtPayOneYrBanksBorr": "0.000000000000",
              "amtPayOneYrCtrldComp": "0.000000000000",
              "amtPayOneYrOthAffil": "0.000000000000",
  ...

One series by ID

Use the series ID to follow one fund over time.

curl -H "Authorization: Bearer $SECFEED_KEY" \
  "https://secfeedapi.com/v1/n-port?data.primary_doc.formData.genInfo.seriesId=S000012004&size=1&fields=flat"
import os, requests

r = requests.get(
    "https://secfeedapi.com/v1/n-port",
    params={'data.primary_doc.formData.genInfo.seriesId': 'S000012004', 'size': '1', 'fields': 'flat'},
    headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
    timeout=60,
)
r.raise_for_status()
print(r.json())
{
  "total": 1,
  "filings": [
    {
      "accessionNo": "0001193125-26-420001",
      "formType": "NPORT-P",
      "filedAt": "2026-10-13",
      "cik": 311101,
      "companyName": "DUPREE MUTUAL FUNDS",
      "flat": null
    }
  ]
}

One trust

cik is the registrant, which can have many series.

curl -H "Authorization: Bearer $SECFEED_KEY" \
  "https://secfeedapi.com/v1/n-port?cik=311101&size=1&fields=flat"
import os, requests

r = requests.get(
    "https://secfeedapi.com/v1/n-port",
    params={'cik': '311101', 'size': '1', 'fields': 'flat'},
    headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
    timeout=60,
)
r.raise_for_status()
print(r.json())
{
  "total": 7,
  "filings": [
    {
      "accessionNo": "0001193125-26-420001",
      "formType": "NPORT-P",
      "filedAt": "2026-10-13",
      "cik": 311101,
      "companyName": "DUPREE MUTUAL FUNDS",
      "flat": null
    }
  ]
}

Response fields

FieldTypeMeaning
totalintegerMatching filings.
filings[].accessionNo / formType / filedAt / cik / companyNamemixedFiling header.
filings[].flatnullAlways null for N-PORT.
filings[].data.primary_doc.headerDataobjectSubmission type, confidentiality flag, filer CIK, series and class IDs.
...formData.genInfo.regName / regCik / regLei / regFileNumberstringRegistrant name, CIK, LEI and 811 file number.
...formData.genInfo.seriesName / seriesId / seriesLeistringThe fund series.
...formData.genInfo.repPdEnd / repPdDatestringFiscal year end and the date the report covers.
...formData.genInfo.isFinalFilingstringY on the fund's last report.
...formData.fundInfo.totAssets / totLiabs / netAssetsstringFund totals.
...formData.fundInfo.amtPay*stringAmounts payable by term and counterparty type.
...formData.fundInfo.curMetrics / creditSprdRisk*objectInterest rate and credit spread risk (DV01, DV100) by tenor.
...formData.fundInfo.returnInfo.monthlyTotReturnsobjectMonthly total returns by share class (rtn1 to rtn3).
...formData.fundInfo.returnInfo.othMon1..3objectRealized gains and unrealized appreciation by month.
...formData.fundInfo.mon1Flow..mon3FlowobjectSales, reinvestments and redemptions by month.
...formData.invstOrSecs.invstOrSec[].name / title / lei / cusipstringHolding issuer, security title and identifiers.
...invstOrSec[].identifiers.isin / ticker / otherobjectAdditional identifiers.
...invstOrSec[].balance / units / curCd / valUSD / pctValstringPosition size, units (NS shares, PA principal), currency, US dollar value and percent of net assets.
...invstOrSec[].payoffProfile / assetCat / issuerCat / invCountrystringLong or short, asset and issuer category, country.
...invstOrSec[].isRestrictedSec / fairValLevelstringRestricted security flag and fair value hierarchy level.
...invstOrSec[].debtSecobjectDebt terms: maturity, coupon kind, rate, default flags.
...invstOrSec[].derivativeInfoobjectDerivative details (swaps, futures, options, forwards) when the holding is a derivative.
...invstOrSec[].securityLendingobjectSecurities lending and collateral flags.
...formData.signatureobjectDate signed, applicant and signer.

Common asset categories (assetCat)

CodeMeaning
ECEquity, common
EPEquity, preferred
DBTDebt
STIVShort-term investment vehicle
DEDerivative, equity
DIRDerivative, interest rate

How to

How do I list a fund's holdings?

Read data.primary_doc.formData.invstOrSecs.invstOrSec of its latest report.

curl -H "Authorization: Bearer $SECFEED_KEY" \
  "https://secfeedapi.com/v1/n-port?data.primary_doc.formData.genInfo.seriesId=S000012004&size=1"
How do I find amended reports?

formType=NPORT-P/A.

curl -H "Authorization: Bearer $SECFEED_KEY" \
  "https://secfeedapi.com/v1/n-port?formType=NPORT-P/A&size=1&fields=flat"
How do I get reports for a date range?

Use startDate and endDate on the filing date.

curl -H "Authorization: Bearer $SECFEED_KEY" \
  "https://secfeedapi.com/v1/n-port?startDate=2026-09-01&endDate=2026-09-30&size=1&fields=flat"
How do I get every series in a trust?

Filter by the trust's cik.

curl -H "Authorization: Bearer $SECFEED_KEY" \
  "https://secfeedapi.com/v1/n-port?cik=311101&size=1&fields=flat"
How do I keep responses small while browsing?

Use fields=flat to list filings, then fetch the ones you need in full.

curl -H "Authorization: Bearer $SECFEED_KEY" \
  "https://secfeedapi.com/v1/n-port?cik=311101&size=1&fields=flat"
Where are monthly returns?

fundInfo.returnInfo.monthlyTotReturns, one entry per share class.

curl -H "Authorization: Bearer $SECFEED_KEY" \
  "https://secfeedapi.com/v1/n-port?startDate=2026-10-01&size=1"
How do I find swaps and other derivatives?

Look for holdings with a derivativeInfo object.

curl -H "Authorization: Bearer $SECFEED_KEY" \
  "https://secfeedapi.com/v1/n-port?startDate=2026-10-01&size=1"
Why are numbers strings?

Values are kept exactly as filed in the XML; convert them as needed.

curl -H "Authorization: Bearer $SECFEED_KEY" \
  "https://secfeedapi.com/v1/n-port?startDate=2026-10-01&size=1"

Try it with your own key

500 free calls a month.

Get free API key →