Obscura

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.

Category Corporate Columns 19 Refresh Every weekday Entity key cik Point-in-time available_date

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.

ColumnTypeDescription
cikbigint · not nullSEC 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_yearinteger · not nullFiscal 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_datedatePUBLIC-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_nametextName 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_compdouble precisionPEO 'Total Compensation' (Summary Comp Table basis) in USD, from ecd:PeoTotalCompAmt; largest value kept when multiple PEOs share a year. Nullable.
peo_actually_paiddouble precisionPEO 'Compensation Actually Paid' in USD, from ecd:PeoActuallyPaidCompAmt; largest-by-absolute-value kept per year. Nullable.
neo_avg_total_compdouble precisionAverage 'Total Compensation' of the non-PEO named executive officers in USD, from ecd:NonPeoNeoAvgTotalCompAmt. Nullable.
neo_avg_actually_paiddouble precisionAverage 'Compensation Actually Paid' of the non-PEO named executive officers in USD, from ecd:NonPeoNeoAvgCompActuallyPaidAmt. Nullable.
total_shareholder_rtndouble precisionCompany 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_rtndouble precisionPeer-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_lossdouble precisionCompany 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_amtdouble precisionValue 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_nametextLabel/name of the company's self-chosen "most important" financial performance measure, from ecd:CompanySelectedMeasureName (e.g. "Adjusted EBITDA", "Revenue"). Nullable.
insider_trd_policies_adoptedbooleanGovernance flag: whether the company has adopted insider-trading policies/procedures, from ecd:InsiderTrdPoliciesProcAdoptedFlag. Nullable.
award_tmg_predeterminedbooleanAward-timing (spring-loading) governance flag: whether the timing of equity-award grants is predetermined, from ecd:AwardTmgPredtrmndFlag. Nullable.
award_tmg_mnpi_consideredbooleanAward-timing governance flag: whether material non-public information is considered when timing equity-award grants, from ecd:AwardTmgMnpiCnsdrdFlag. Nullable.
mnpi_disc_timed_for_comp_valbooleanAward-timing governance flag: whether MNPI disclosure is timed to affect the value of executive awards, from ecd:MnpiDiscTimedForCompValFlag. Nullable.
filenametextEDGAR 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_attimestamp with time zone · not nullInternal 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.

Related datasets

Board InterlocksPairs of public companies that share a director, reconstructed from SEC insider filings: one row per (director, company … Company SubsidiariesParent-and-subsidiary lists taken from the Exhibit 21 that public companies attach to their annual report. Domain SubdomainsSubdomains discovered for each public company's domains through Certificate Transparency logs (crt.sh). Employee CountsEmployee headcount as stated in the text of 10-K annual reports. Governance EventsGovernance events distilled from company 8-K filings and tagged by type: executive changes, auditor changes, restatement… Insider SentimentMonthly insider buying and selling per company, netted from Form 4 open-market trades: shares and dollars bought versus … Job PostingsOpen job-posting counts for a curated set of companies, captured over time. O*NET Occupation DataThe O*NET database of occupations: the tasks, skills and requirements that define each job, by release version.