EDGAR N-PX Votes
Fund proxy-voting records from N-PX filings: how each fund voted on management and shareholder proposals.
edgar_npx_votes — the dataset name to pass to the Obscura API.
What one row means
A single N-PX proxy-voting record: how one reporting fund voted on one ballot item (`proxyTable` entry) at one portfolio company's shareholder meeting, versus management's recommendation.
One row per (filename, seq) — seq is the zero-based ordinal position of the <proxyTable> block within the N-PX submission at filename..
Point-in-time availability
Every Obscura dataset carries available_date: the calendar day the publisher made the row
available, day-of, with no session rounding. It is the one column a backtest filters on, and it means the
same thing on every dataset in the catalog.
For edgar_npx_votes: published: available_date recovered via filename -> edgar_filings.event_date (the EDGAR daily-index filing/dissemination date), the true public-availability anchor; occurred_on (the shareholder-meeting date) is the separate real-world event date and is NOT when the vote became public.
Refresh cadence
Obscura refreshes edgar_npx_votes every weekday — the most frequent scheduled job that re-collects or re-exports it. This is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when a row became public is recorded per row in available_date.
Schema — 18 columns
The full public column list for edgar_npx_votes, with the meaning of every field. The same
schema is served unauthenticated at https://api.obscura.trade/v1/catalog/edgar_npx_votes.
| Column | Type | Description |
|---|---|---|
| filename | text · not null | EDGAR archive path of the source N-PX submission (e.g. edgar/data/{cik}/{accession}.txt); PK part and join key to edgar_filings for the true public/filing date. |
| seq | integer · not null | Zero-based ordinal of the <proxyTable> block within the submission; disambiguates multiple votes in one filing (PK part). |
| issuer_name | text | Name of the portfolio company whose meeting was voted at, from <issuerName> (nullable). |
| cusip | text | CUSIP of the voted security, from <cusip> (nullable; indexed via ix_edgar_npx_votes_cusip). |
| isin | text | ISIN of the voted security, from <isin> (nullable). |
| available_date | date | The filing's SEC dissemination date — when the public could first see it. Recovered from edgar_filings via filename. The point-in-time anchor. |
| occurred_on | date | The shareholder-meeting date the vote was cast at (the real-world event). |
| vote_description | text | Free-text description of the ballot item, from <voteDescription> (e.g. 'Say-on-pay advisory vote', 'Election of directors'). |
| category | text | Ballot-item category, from <categoryType> (e.g. 'SECTION 14A SAY-ON-PAY VOTES'). |
| vote_source | text | Origin of the proposal, from <voteSource>: "ISSUER" or "SHAREHOLDER". |
| shares_voted | double precision | Number of shares the fund voted on the item, from <sharesVoted> (comma-stripped). |
| shares_on_loan | double precision | Number of shares on loan (and thus not voted), from <sharesOnLoan>. |
| how_voted | text | How the fund voted, from the first <howVoted> record: FOR / AGAINST / ABSTAIN / WITHHELD etc. |
| mgmt_recommendation | text | Management's recommendation on the item, from <managementRecommendation>; comparing to how_voted surfaces votes-against-management. |
| figi | text | FIGI security identifier of the voted security, from <figi> (nullable; a canonical cross-dataset security id some post-2024 N-PX filings emit alongside cusip/isin). |
| vote_series | text | Series/class of the voted security in multi-series holdings, from <voteSeries> (nullable; disambiguates which share class was voted). |
| vote_manager | text | Index into the filing's included-managers list attributing the vote to a specific sub-adviser in an aggregated multi-manager N-PX, from <voteManager> (nullable). |
| scraped_at | timestamp with time zone · not null | Internal ingestion timestamp (Utc::now() at upsert; DB default current_timestamp). Ingestion metadata, not a data event time; excluded from exports. |
Access edgar_npx_votes
Two delivery paths, one identifier. Both require an Obscura account and an active subscription; the catalog entry and the schema above are public.
import obscura
client = obscura.Client("obs_live_…")
df = client.query(
dataset="edgar_npx_votes",
start="2024-01-01",
)
Create a free account Browse all 95 datasets
Frequently asked questions
What is in the edgar_npx_votes dataset?
Fund proxy-voting records from N-PX filings: how each fund voted on management and shareholder proposals. A single N-PX proxy-voting record: how one reporting fund voted on one ballot item (`proxyTable` entry) at one portfolio company's shareholder meeting, versus management's recommendation.
How do I avoid look-ahead bias with edgar_npx_votes?
Filter on edgar_npx_votes.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — published: available_date recovered via filename -> edgar_filings.event_date (the EDGAR daily-index filing/dissemination date), the true public-availability anchor; occurred_on (the shareholder-meeting date) is the separate real-world event date and is NOT when the vote became public. A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.
In what formats can I get edgar_npx_votes?
As a Parquet bulk export (POST https://api.obscura.trade/v1/download) or as JSON from the typed query API (POST https://api.obscura.trade/v1/query), both with dataset="edgar_npx_votes". The column schema is public at https://api.obscura.trade/v1/catalog/edgar_npx_votes.
How often is edgar_npx_votes updated?
Obscura refreshes edgar_npx_votes on a every weekday schedule — that is the most frequent scheduled job that re-collects or re-exports the table. It is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when the publisher makes a row available is described by the availability rule above, and is recorded per row in available_date.