Endpoints
/v1/n-px
https://secfeedapi.com/v1/n-pxProxy voting records (N-PX).
| Parameter | Type | Description | Example |
|---|---|---|---|
cik | integer | Filer CIK (the fund trust or manager). | 1418427 |
startDate | string | Earliest filing date, YYYY-MM-DD. | 2026-08-01 |
endDate | string | Latest filing date, YYYY-MM-DD. | 2026-10-31 |
formType | string | N-PX or N-PX/A. | N-PX |
from | integer | Offset of the first row to return, for paging. Default 0. | 20 |
size | integer | Filings per page. Capped at 100. Default 20. | 5 |
fields | string | flat drops the data object; for N-PX that leaves only metadata, since flat is null. | flat |
data.<path> | string | Filter on any value in the parsed XML by JSON path. | YEAR |
- Most N-PX filings arrive in August for the year ending June 30.
- A single filing can hold tens of thousands of vote rows; keep size small.
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
| Field | Type | Meaning |
|---|---|---|
total | integer | Number of matching N-PX filings. |
filings[] | array | Filings, newest first. |
filings[].accessionNo | string | Accession number. |
filings[].formType | string | N-PX or N-PX/A. |
filings[].filedAt | string | Filing date. |
filings[].cik | integer | Filer CIK. |
filings[].companyName | string | Filer name. |
filings[].flat | object | null for N-PX; read data instead. |
filings[].data.primary_doc.headerData.submissionType | string | Submission type. |
filings[].data.primary_doc.headerData.filerInfo.registrantType | string | Registrant type, for example a fund or an institutional manager. |
filings[].data.primary_doc.headerData.filerInfo.liveTestFlag | string | LIVE for real filings. |
filings[].data.primary_doc.headerData.filerInfo.filer.issuerCredentials.cik | string | Filer CIK, zero padded. |
filings[].data.primary_doc.headerData.filerInfo.filer.issuerCredentials.ccc | string | Always masked as XXXXXXXX. |
filings[].data.primary_doc.headerData.filerInfo.flags.overrideInternetFlag | string | Override internet flag. |
filings[].data.primary_doc.headerData.filerInfo.flags.confirmingCopyFlag | string | Confirming copy flag. |
filings[].data.primary_doc.headerData.filerInfo.periodOfReport | string | End of the reporting year, usually June 30. |
filings[].data.primary_doc.formData.coverPage.yearOrQuarter | string | YEAR or QUARTER. |
filings[].data.primary_doc.formData.coverPage.reportCalendarYear | string | Calendar year of the report. |
filings[].data.primary_doc.formData.coverPage.reportingPerson.name | string | Name of the reporting person. |
filings[].data.primary_doc.formData.coverPage.reportingPerson.phoneNumber | string | Phone number. |
filings[].data.primary_doc.formData.coverPage.reportingPerson.address.street1 | string | Street address. |
filings[].data.primary_doc.formData.coverPage.reportingPerson.address.city | string | City. |
filings[].data.primary_doc.formData.coverPage.reportingPerson.address.stateOrCountry | string | State or country code. |
filings[].data.primary_doc.formData.coverPage.reportingPerson.address.zipCode | string | Postal code. |
filings[].data.primary_doc.formData.coverPage.reportInfo.reportType | string | Report type, for example INSTITUTIONAL MANAGER VOTING REPORT. |
filings[].data.primary_doc.formData.coverPage.reportInfo.confidentialTreatment | string | Whether confidential treatment was requested. |
filings[].data.primary_doc.formData.coverPage.fileNumber | string | SEC file number. |
filings[].data.primary_doc.formData.coverPage.explanatoryInformation.explanatoryChoice | string | Whether explanatory notes are included. |
filings[].data.primary_doc.formData.summaryPage.otherIncludedManagersCount | string | Number of other included managers. |
filings[].data.primary_doc.formData.signaturePage.reportingPerson | string | Reporting person on the signature page. |
filings[].data.primary_doc.formData.signaturePage.txSignature | string | Signature. |
filings[].data.primary_doc.formData.signaturePage.txPrintedSignature | string | Printed name of the signer. |
filings[].data.primary_doc.formData.signaturePage.txTitle | string | Signer title. |
filings[].data.primary_doc.formData.signaturePage.txAsOfDate | string | Signature date. |
filings[].data.<vote table>.proxyTable[] | array | One 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[].issuerName | string | Company whose meeting it was. |
filings[].data.<vote table>.proxyTable[].cusip | string | CUSIP of the security voted. |
filings[].data.<vote table>.proxyTable[].meetingDate | string | Meeting date. |
filings[].data.<vote table>.proxyTable[].voteDescription | string | The matter voted on. |
filings[].data.<vote table>.proxyTable[].voteCategories.voteCategory.categoryType | string | SEC category of the matter, for example DIRECTOR ELECTIONS. |
filings[].data.<vote table>.proxyTable[].sharesVoted | string | Shares voted on the matter. |
filings[].data.<vote table>.proxyTable[].sharesOnLoan | string | Shares on loan and not voted. |
filings[].data.<vote table>.proxyTable[].vote.voteRecord.howVoted | string | FOR, AGAINST, ABSTAIN, WITHHOLD and so on. |
filings[].data.<vote table>.proxyTable[].vote.voteRecord.sharesVoted | string | Shares voted that way. |
filings[].data.<vote table>.proxyTable[].vote.voteRecord.managementRecommendation | string | Management'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
- 400 when size or from is not a number.
See also the error codes every endpoint shares.
Try it with your own key
500 free calls a month.