Board Composition and Committee Membership
Board composition from SEC DEF 14A proxy statements: one row per director per proxy, with age, year first elected, independence, board role, audit/compensation/nominating committee seats, committee chairmanships and other public directorships. Extracted from proxy prose and tables, so each row carries how it was obtained and how far to trust it.
edgar_board_members - the dataset name to pass to the Obscura API.
What one row means
One director as presented on one company's DEF 14A proxy statement, with their tenure, independence, committee seats and other public directorships.
One row per (filename, seq).
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_board_members: filing_join: available_date is the day SEC disseminated the proxy, taken from the bronze dissemination-day partition exactly as every other feed-derived dataset does - never the proxy's own cover date, which precedes publication. The FISCAL YEAR the proxy reports on is rehomed to period_end and must never be used as the availability basis: a proxy filed in April 2026 describes board service through 2025, so treating the reporting year as availability would make a board roster visible a year before it was published.
Refresh cadence
Obscura refreshes edgar_board_members daily - 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 - 20 columns
The full public column list for edgar_board_members, with the meaning of every field. The same
schema is served unauthenticated at https://api.obscura.trade/v1/catalog/edgar_board_members.
| Column | Type | Description |
|---|---|---|
| filename | text · not null | The proxy's EDGAR Archives path - the unique accession that carries this board roster. Part of the key, and the provenance a consumer follows back to the filed document. |
| seq | integer · not null | Zero-based index of this director within the proxy's board table, in the order the document lists them. Part of the key because a proxy names many directors and the printed name is not a safe key - two directors can share a name, and the same person is spelled differently across years. |
| cik | bigint · not null | CIK of the COMPANY whose board this is - the proxy's filer. The join to every other EDGAR dataset. |
| company_name | text | The company name as filed. |
| director_name | text · not null | The director's name EXACTLY as printed in the proxy, including middle initials and suffixes. Deliberately not normalised: normalisation is lossy and irreversible, and the raw string is what a consumer needs to audit a match. Match on `matched_owner_cik` instead. |
| matched_owner_cik | bigint | Best-effort match of `director_name` to a Form 4 filer's `owner_cik`, so this dataset joins to `people` and `board_interlocks`. NULL when no confident match exists - which is the honest answer far more often than a wrong CIK would be. Read `match_confidence` before relying on it. |
| match_confidence | double precision | How confident the name match is, 0.0 to 1.0. NULL when unmatched. A join for research should threshold this; a join that ignores it will silently merge two different people who share a name. |
| age | integer | Director's age as stated in the proxy, or NULL when not disclosed. Proxies usually print age; some omit it. |
| director_since_year | integer | The year the director first joined this board, as the proxy states it ("Director since 2014"). The tenure measure, and the field Form 4 cannot give you - Form 4 only knows when someone first FILED, which is a different and later date. |
| is_independent | boolean | Whether the company classifies this director as INDEPENDENT under the listing standards it is subject to. NULL when the proxy does not say. This is the company's own assertion, not an assessment: boards decide their own independence determinations and disclose them. Treat it as a disclosed fact about what the board claims, which is exactly what makes it interesting when it changes. |
| board_role | text | The director's role on the board where the proxy names one: `chair`, `lead_independent`, `vice_chair`, or NULL for an ordinary member. |
| on_audit_committee | boolean | Serves on the audit committee. |
| on_compensation_committee | boolean | Serves on the compensation committee. |
| on_nominating_committee | boolean | Serves on the nominating and corporate-governance committee. |
| committee_chair_of | text | The committee this director CHAIRS, where the proxy says so (`audit`, `compensation`, `nominating`), else NULL. Chairing is materially different from serving and is disclosed separately. |
| other_public_boards | integer | How many OTHER public-company boards the director sits on, as disclosed. The overboarding measure that proxy advisers score against, and one of the few board attributes with a widely-agreed threshold. |
| extraction_method | text · not null | HOW THIS ROW WAS OBTAINED, because the source is unstructured and the method determines the trust: `table` (parsed from a structured director table), `prose` (extracted from narrative bio text), or `xbrl` (a tagged fact, where a filer provides one). Carried as a real column rather than a caveat in prose so a consumer can filter on it, and so a later parser improvement is measurable as a shift in the mix rather than an invisible change. |
| extraction_confidence | double precision · not null | How much to trust this row, 0.0 to 1.0, from the extractor's own signals - how well the table matched an expected shape, whether the fields cross-agree, whether the director count is plausible for a public board. **This dataset is inference, not transcription.** Every other EDGAR dataset here parses XML or inline XBRL; a proxy is prose written to no schema. Filtering on this column is the correct way to use the data. |
| period_end | date | The fiscal year the proxy reports on, as its last day. REHOMED here and never allowed onto `available_date`: a proxy filed in April 2026 describes service through 2025, so using the reporting year as availability would publish a board roster a year before anyone could read it. **NULL on every `extraction_method = 'table'` row, and that is a stated absence rather than a gap.** A director summary table states no reporting period, and EDGAR's own `CONFORMED PERIOD OF REPORT` on a DEF 14A is the ANNUAL MEETING DATE — which falls AFTER dissemination — so reading it here would fabricate a fiscal year out of a field that means something else. The column is real for the prose extractor, which can read "fiscal year ended September 28, 2025" off the page. |
| available_date | date · not null | PUBLIC-AVAILABILITY DATE - the day SEC disseminated this proxy. **The point-in-time column.** Exact, from the bronze dissemination-day partition, even though the row's CONTENT is heuristic. |
Access edgar_board_members
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_board_members",
symbols=["NVDA", "AAPL"],
start="2024-01-01",
)
Create a free account Browse all 123 datasets
Frequently asked questions
What is in the edgar_board_members dataset?
Board composition from SEC DEF 14A proxy statements: one row per director per proxy, with age, year first elected, independence, board role, audit/compensation/nominating committee seats, committee chairmanships and other public directorships. Extracted from proxy prose and tables, so each row carries how it was obtained and how far to trust it. One director as presented on one company's DEF 14A proxy statement, with their tenure, independence, committee seats and other public directorships.
How do I avoid look-ahead bias with edgar_board_members?
Filter on edgar_board_members.available_date, the day the publisher made the row public. For this dataset that date is derived as follows - filing_join: available_date is the day SEC disseminated the proxy, taken from the bronze dissemination-day partition exactly as every other feed-derived dataset does - never the proxy's own cover date, which precedes publication. The FISCAL YEAR the proxy reports on is rehomed to period_end and must never be used as the availability basis: a proxy filed in April 2026 describes board service through 2025, so treating the reporting year as availability would make a board roster visible a year before it was published. 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_board_members?
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_board_members". The column schema is public at https://api.obscura.trade/v1/catalog/edgar_board_members.
Can I filter edgar_board_members by company or symbol?
Yes. edgar_board_members carries cik, the column the API's symbols filter resolves against.
How often is edgar_board_members updated?
Obscura refreshes edgar_board_members on a daily 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.