Home / Developers / N-PX Votes API
API reference

N-PX Votes API

Form N-PX proxy voting records: how funds and institutional managers voted at each company meeting, matter by matter, as structured JSON from the filing's XML. Includes the cover page and every vote row the filer reported. Product overview →

Endpoints

/v1/n-px

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

Proxy voting records (N-PX).

ParameterTypeDescriptionExample
cikintegerFiler CIK (the fund trust or manager).1418427
startDatestringEarliest filing date, YYYY-MM-DD.2026-08-01
endDatestringLatest filing date, YYYY-MM-DD.2026-10-31
formTypestringN-PX or N-PX/A.N-PX
fromintegerOffset of the first row to return, for paging. Default 0.20
sizeintegerFilings per page. Capped at 100. Default 20.5
fieldsstringflat drops the data object; for N-PX that leaves only metadata, since flat is null.flat
data.<path>stringFilter on any value in the parsed XML by JSON path.YEAR

Request examples

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

Newest N-PX filing

Cover page and the full vote table of the latest filing.

curl -H "Authorization: Bearer $SECFEED_KEY" \
  "https://secfeedapi.com/v1/n-px?size=1"
import os, requests

r = requests.get(
    "https://secfeedapi.com/v1/n-px",
    params={'size': '1'},
    headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
    timeout=60,
)
r.raise_for_status()
print(r.json())
{
  "total": 35,
  "filings": [
    {
      "accessionNo": "0001085146-26-000891",
      "formType": "N-PX",
      "filedAt": "2026-10-13",
      "cik": 1418427,
      "companyName": "Robeco Schweiz AG",
      "flat": null,
      "data": {
        "primary_doc": {
          "headerData": {
            "submissionType": "N-PX",
            "filerInfo": {
              "registrantType": "IM",
              "liveTestFlag": "LIVE",
              "filer": {
                "issuerCredentials": {
                  "cik": "0001418427",
                  "ccc": "XXXXXXXX"
                }
              },
              "flags": {
                "overrideInternetFlag": "false",
                "confirmingCopyFlag": "false"
              },
              "periodOfReport": "06/30/2025"
            }
          },
          "formData": {
            "coverPage": {
              "yearOrQuarter": "YEAR",
              "reportCalendarYear": "2025",
              "reportingPerson": {
                "name": "Robeco Schweiz AG",
                "phoneNumber": "41-44-653-12-41",
                "address": {
                  "street1": "Josefstrasse 218",
                  "city": "ZURICH",
                  "stateOrCountry": "V8",
                  "zipCode": "8005"
                }
              },
              "reportInfo": {
                "reportType": "INSTITUTIONAL MANAGER VOTING REPORT",
                "confidentialTreatment": "N"
              },
              "fileNumber": "028-12627",
              "explanatoryInformation": {
                "explanatoryChoice": "N"
              }
            },
            "summaryPage": {
              "otherIncludedManagersCount": "0"
            },
            "signaturePage": {
              "reportingPerson": "Robeco Schweiz AG",
              "txSignature": "Meyong-Hee Sim",
              "txPrintedSignature": "Meyong-Hee Sim",
  ...

Metadata only

Filer, form and date without the vote rows.

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

r = requests.get(
    "https://secfeedapi.com/v1/n-px",
    params={'size': '5', 'fields': 'flat'},
    headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
    timeout=60,
)
r.raise_for_status()
print(r.json())
{
  "total": 35,
  "filings": [
    {
      "accessionNo": "0001085146-26-000891",
      "formType": "N-PX",
      "filedAt": "2026-10-13",
      "cik": 1418427,
      "companyName": "Robeco Schweiz AG",
      "flat": null
    },
    {
      "accessionNo": "0001214659-26-012727",
      "formType": "N-PX",
      "filedAt": "2026-10-09",
      "cik": 1821984,
      "companyName": "Rockbridge Investment Management, LCC",
      "flat": null
    }
  ]
}

N-PX filings in a date range

Use total to see how many filings arrived.

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

r = requests.get(
    "https://secfeedapi.com/v1/n-px",
    params={'startDate': '2026-08-01', 'endDate': '2026-10-31', 'size': '2', 'fields': 'flat'},
    headers={"Authorization": f"Bearer {os.environ['SECFEED_KEY']}"},
    timeout=60,
)
r.raise_for_status()
print(r.json())
{
  "total": 35,
  "filings": [
    {
      "accessionNo": "0001085146-26-000891",
      "formType": "N-PX",
      "filedAt": "2026-10-13",
      "cik": 1418427,
      "companyName": "Robeco Schweiz AG",
      "flat": null
    },
    {
      "accessionNo": "0001214659-26-012727",
      "formType": "N-PX",
      "filedAt": "2026-10-09",
      "cik": 1821984,
      "companyName": "Rockbridge Investment Management, LCC",
      "flat": null
    }
  ]
}

Response fields

FieldTypeMeaning
totalintegerNumber of matching N-PX filings.
filings[]arrayFilings, newest first.
filings[].accessionNostringAccession number.
filings[].formTypestringN-PX or N-PX/A.
filings[].filedAtstringFiling date.
filings[].cikintegerFiler CIK.
filings[].companyNamestringFiler name.
filings[].flatobjectnull for N-PX; read data instead.
filings[].data.primary_doc.headerData.submissionTypestringSubmission type.
filings[].data.primary_doc.headerData.filerInfo.registrantTypestringRegistrant type, for example a fund or an institutional manager.
filings[].data.primary_doc.headerData.filerInfo.liveTestFlagstringLIVE for real filings.
filings[].data.primary_doc.headerData.filerInfo.filer.issuerCredentials.cikstringFiler CIK, zero padded.
filings[].data.primary_doc.headerData.filerInfo.filer.issuerCredentials.cccstringAlways masked as XXXXXXXX.
filings[].data.primary_doc.headerData.filerInfo.flags.overrideInternetFlagstringOverride internet flag.
filings[].data.primary_doc.headerData.filerInfo.flags.confirmingCopyFlagstringConfirming copy flag.
filings[].data.primary_doc.headerData.filerInfo.periodOfReportstringEnd of the reporting year, usually June 30.
filings[].data.primary_doc.formData.coverPage.yearOrQuarterstringYEAR or QUARTER.
filings[].data.primary_doc.formData.coverPage.reportCalendarYearstringCalendar year of the report.
filings[].data.primary_doc.formData.coverPage.reportingPerson.namestringName of the reporting person.
filings[].data.primary_doc.formData.coverPage.reportingPerson.phoneNumberstringPhone number.
filings[].data.primary_doc.formData.coverPage.reportingPerson.address.street1stringStreet address.
filings[].data.primary_doc.formData.coverPage.reportingPerson.address.citystringCity.
filings[].data.primary_doc.formData.coverPage.reportingPerson.address.stateOrCountrystringState or country code.
filings[].data.primary_doc.formData.coverPage.reportingPerson.address.zipCodestringPostal code.
filings[].data.primary_doc.formData.coverPage.reportInfo.reportTypestringReport type, for example INSTITUTIONAL MANAGER VOTING REPORT.
filings[].data.primary_doc.formData.coverPage.reportInfo.confidentialTreatmentstringWhether confidential treatment was requested.
filings[].data.primary_doc.formData.coverPage.fileNumberstringSEC file number.
filings[].data.primary_doc.formData.coverPage.explanatoryInformation.explanatoryChoicestringWhether explanatory notes are included.
filings[].data.primary_doc.formData.summaryPage.otherIncludedManagersCountstringNumber of other included managers.
filings[].data.primary_doc.formData.signaturePage.reportingPersonstringReporting person on the signature page.
filings[].data.primary_doc.formData.signaturePage.txSignaturestringSignature.
filings[].data.primary_doc.formData.signaturePage.txPrintedSignaturestringPrinted name of the signer.
filings[].data.primary_doc.formData.signaturePage.txTitlestringSigner title.
filings[].data.primary_doc.formData.signaturePage.txAsOfDatestringSignature date.
filings[].data.<vote table>.proxyTable[]arrayOne row per vote. The key holding the table depends on the filing agent (proxyvotetable, ProxyVotingTable or a file name), so find the key that contains proxyTable.
filings[].data.<vote table>.proxyTable[].issuerNamestringCompany whose meeting it was.
filings[].data.<vote table>.proxyTable[].cusipstringCUSIP of the security voted.
filings[].data.<vote table>.proxyTable[].meetingDatestringMeeting date.
filings[].data.<vote table>.proxyTable[].voteDescriptionstringThe matter voted on.
filings[].data.<vote table>.proxyTable[].voteCategories.voteCategory.categoryTypestringSEC category of the matter, for example DIRECTOR ELECTIONS.
filings[].data.<vote table>.proxyTable[].sharesVotedstringShares voted on the matter.
filings[].data.<vote table>.proxyTable[].sharesOnLoanstringShares on loan and not voted.
filings[].data.<vote table>.proxyTable[].vote.voteRecord.howVotedstringFOR, AGAINST, ABSTAIN, WITHHOLD and so on.
filings[].data.<vote table>.proxyTable[].vote.voteRecord.sharesVotedstringShares voted that way.
filings[].data.<vote table>.proxyTable[].vote.voteRecord.managementRecommendationstringManagement's recommendation. Filers code shareholder proposals inconsistently.

How to

How do I list recent N-PX filers without downloading votes?

Use fields=flat.

curl -H "Authorization: Bearer $SECFEED_KEY" \
  "https://secfeedapi.com/v1/n-px?size=20&fields=flat"
How do I get one filer's votes?

Pass the filer's cik.

curl -H "Authorization: Bearer $SECFEED_KEY" \
  "https://secfeedapi.com/v1/n-px?cik=1418427&size=1"
How do I find the vote table in data?

Look for the key under data that contains proxyTable; its name depends on the filing agent.

curl -H "Authorization: Bearer $SECFEED_KEY" \
  "https://secfeedapi.com/v1/n-px?size=1"
How do I see how a fund voted on one company?

Filter proxyTable rows client side by cusip or issuerName.

curl -H "Authorization: Bearer $SECFEED_KEY" \
  "https://secfeedapi.com/v1/n-px?size=1"
How do I count votes against management?

Compare howVoted with managementRecommendation per row. Treat shareholder proposals with care, since filers code the recommendation inconsistently.

curl -H "Authorization: Bearer $SECFEED_KEY" \
  "https://secfeedapi.com/v1/n-px?size=1"
How do I page through filings?

Use from and size.

curl -H "Authorization: Bearer $SECFEED_KEY" \
  "https://secfeedapi.com/v1/n-px?size=5&from=5&fields=flat"
How do I get only amendments?

Pass formType=N-PX/A.

curl -H "Authorization: Bearer $SECFEED_KEY" \
  "https://secfeedapi.com/v1/n-px?formType=N-PX/A&fields=flat&size=5"
Where is the filing itself?

Use the accession number with the Download API or /v1/files.

curl -H "Authorization: Bearer $SECFEED_KEY" \
  "https://secfeedapi.com/v1/n-px?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 →