Executive Compensation
Executive pay from the Pay-versus-Performance table in proxy statements: reported and 'actually paid' compensation for the CEO and named officers.
exec_comp — the dataset name to pass to the Obscura API.
What one row means
One company's Pay-versus-Performance (PvP) compensation summary for a single fiscal year, parsed from the `ecd:` inline-XBRL facts in a DEF 14A/DEFR14A/DEFA14A proxy: the principal executive officer (CEO) total and "actually paid" compensation, plus the average total/actually-paid for the other named executives. Keyless in the sense that a single proxy filing discloses 3-5 fiscal years of PvP at once, so multiple filings upsert the same (cik, fiscal_year) row over time; `filename` reflects whichever proxy last wrote it.
One row per (cik, fiscal_year).
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 exec_comp: published: available_date = join exec_comp.filename -> edgar_filings.filename -> edgar_filings.event_date, the DEF 14A proxy's SEC filing/dissemination date.
Refresh cadence
Obscura refreshes exec_comp 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 — 19 columns
The full public column list for exec_comp, with the meaning of every field. The same
schema is served unauthenticated at https://api.obscura.trade/v1/catalog/exec_comp.
| Column | Type | Description |
|---|---|---|
| cik | bigint · not null | SEC Central Index Key of the filing company; copied from the joined edgar_filings row, not parsed from the XBRL. Part of the primary key. |
| fiscal_year | integer · not null | Fiscal year the compensation figures report on, taken as the LATEST 4-digit year in the XBRL contextRef (the period end). A reporting period, NOT the public-availability date — it predates public disclosure by months to years. Part of the primary key. |
| available_date | date | PUBLIC-availability date = the DEF 14A proxy's SEC filing/dissemination date (from the owning edgar_filings row via filename). The point-in-time anchor to filter/join on — NEVER fiscal_year, which is the reporting period and is disclosed months to years later. |
| peo_name | text | Name of the Principal Executive Officer (CEO) for that fiscal year, from ecd:PeoName; nested/transition-year markup stripped, truncated to 80 chars. Nullable. |
| peo_total_comp | double precision | PEO 'Total Compensation' (Summary Comp Table basis) in USD, from ecd:PeoTotalCompAmt; largest value kept when multiple PEOs share a year. Nullable. |
| peo_actually_paid | double precision | PEO 'Compensation Actually Paid' in USD, from ecd:PeoActuallyPaidCompAmt; largest-by-absolute-value kept per year. Nullable. |
| neo_avg_total_comp | double precision | Average 'Total Compensation' of the non-PEO named executive officers in USD, from ecd:NonPeoNeoAvgTotalCompAmt. Nullable. |
| neo_avg_actually_paid | double precision | Average 'Compensation Actually Paid' of the non-PEO named executive officers in USD, from ecd:NonPeoNeoAvgCompActuallyPaidAmt. Nullable. |
| total_shareholder_rtn | double precision | Company cumulative total shareholder return for the fiscal year, indexed to $100 at the PvP measurement-period start, from ecd:TotalShareholderRtnAmt — the "Performance" half of Pay-versus-Performance. Nullable. |
| peer_group_total_shareholder_rtn | double precision | Peer-group cumulative total shareholder return the company TSR is benchmarked against (indexed to $100), from ecd:PeerGroupTotalShareholderRtnAmt. Absent in smaller-reporting-company filings. Nullable. |
| net_income_loss | double precision | Company net income/loss for the fiscal year in USD, a mandated PvP column, from ecd:NetIncomeLoss. Absent in smaller-reporting-company filings. Nullable. |
| company_selected_measure_amt | double precision | Value of the company's self-chosen "most important" financial performance measure linking pay to performance, from ecd:CompanySelectedMeasureAmt (unit given by company_selected_measure_name). Nullable. |
| company_selected_measure_name | text | Label/name of the company's self-chosen "most important" financial performance measure, from ecd:CompanySelectedMeasureName (e.g. "Adjusted EBITDA", "Revenue"). Nullable. |
| insider_trd_policies_adopted | boolean | Governance flag: whether the company has adopted insider-trading policies/procedures, from ecd:InsiderTrdPoliciesProcAdoptedFlag. Nullable. |
| award_tmg_predetermined | boolean | Award-timing (spring-loading) governance flag: whether the timing of equity-award grants is predetermined, from ecd:AwardTmgPredtrmndFlag. Nullable. |
| award_tmg_mnpi_considered | boolean | Award-timing governance flag: whether material non-public information is considered when timing equity-award grants, from ecd:AwardTmgMnpiCnsdrdFlag. Nullable. |
| mnpi_disc_timed_for_comp_val | boolean | Award-timing governance flag: whether MNPI disclosure is timed to affect the value of executive awards, from ecd:MnpiDiscTimedForCompValFlag. Nullable. |
| filename | text | EDGAR document path of the source DEF 14A proxy (e.g. edgar/data/320193/0000...-26-000123.txt); the join key into edgar_filings that yields the true public/filing date. Nullable. |
| scraped_at | timestamp with time zone · not null | Internal ingestion timestamp (set to Utc::now() on upsert); excluded from exports. Named scraped_at rather than the standard synced_at, same concept. |
Access exec_comp
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="exec_comp",
symbols=["NVDA", "AAPL"],
start="2024-01-01",
)
Create a free account Browse all 95 datasets
Frequently asked questions
What is in the exec_comp dataset?
Executive pay from the Pay-versus-Performance table in proxy statements: reported and 'actually paid' compensation for the CEO and named officers. One company's Pay-versus-Performance (PvP) compensation summary for a single fiscal year, parsed from the `ecd:` inline-XBRL facts in a DEF 14A/DEFR14A/DEFA14A proxy: the principal executive officer (CEO) total and "actually paid" compensation, plus the average total/actually-paid for the other named executives. Keyless in the sense that a single proxy filing discloses 3-5 fiscal years of PvP at once, so multiple filings upsert the same (cik, fiscal_year) row over time; `filename` reflects whichever proxy last wrote it.
How do I avoid look-ahead bias with exec_comp?
Filter on exec_comp.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — published: available_date = join exec_comp.filename -> edgar_filings.filename -> edgar_filings.event_date, the DEF 14A proxy's SEC filing/dissemination date. A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.
In what formats can I get exec_comp?
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="exec_comp". The column schema is public at https://api.obscura.trade/v1/catalog/exec_comp.
Can I filter exec_comp by company or symbol?
Yes. exec_comp carries cik, the column the API's symbols filter resolves against.
How often is exec_comp updated?
Obscura refreshes exec_comp 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.