Board Interlocks
Pairs of public companies that share a director, reconstructed from SEC insider filings: one row per (director, company A, company B). The edge list behind any board-network or shared-directorship analysis.
board_interlocks — the dataset name to pass to the Obscura API.
What one row means
One director interlock: a single director who sits on the boards of two different companies — a read-only `board_interlocks` MATERIALIZED VIEW over `person_roles` (a self-join on shared director). `company_a_cik < company_b_cik` dedupes the ordered pair. Refreshed nightly by `RefreshGovernanceViews`.
One row per One row per (owner_cik, company_a_cik, company_b_cik), with company_a_cik < company_b_cik..
Derived in-database from person_roles.
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 board_interlocks: snapshot: available_date = greatest(company_a role available_date, company_b role available_date) — the interlock is only knowable once BOTH directors' latest board filings are public. Refreshed nightly.
Refresh cadence
Obscura refreshes board_interlocks 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 — 7 columns
The full public column list for board_interlocks, with the meaning of every field. The same
schema is served unauthenticated at https://api.obscura.trade/v1/catalog/board_interlocks.
| Column | Type | Description |
|---|---|---|
| owner_cik | bigint · not null | SEC CIK of the director who sits on both boards. |
| director | text | The director's name (most recent value seen across filings). |
| company_a_cik | bigint · not null | SEC CIK of the first company (the lower CIK of the pair). |
| company_a | text | Ticker of the first company. |
| company_b_cik | bigint · not null | SEC CIK of the second company (the higher CIK). |
| company_b | text | Ticker of the second company. |
| available_date | date | PUBLIC-availability date = greatest of the two directors' latest role filing dates: the pair is only provable once both sides' board filings are public. The point-in-time column to filter/join on. |
Access board_interlocks
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="board_interlocks",
symbols=["NVDA", "AAPL"],
start="2024-01-01",
)
Create a free account Browse all 95 datasets
Frequently asked questions
What is in the board_interlocks dataset?
Pairs of public companies that share a director, reconstructed from SEC insider filings: one row per (director, company A, company B). The edge list behind any board-network or shared-directorship analysis. One director interlock: a single director who sits on the boards of two different companies — a read-only `board_interlocks` MATERIALIZED VIEW over `person_roles` (a self-join on shared director). `company_a_cik < company_b_cik` dedupes the ordered pair. Refreshed nightly by `RefreshGovernanceViews`.
How do I avoid look-ahead bias with board_interlocks?
Filter on board_interlocks.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — snapshot: available_date = greatest(company_a role available_date, company_b role available_date) — the interlock is only knowable once BOTH directors' latest board filings are public. Refreshed nightly. A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.
In what formats can I get board_interlocks?
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="board_interlocks". The column schema is public at https://api.obscura.trade/v1/catalog/board_interlocks.
Can I filter board_interlocks by company or symbol?
Yes. board_interlocks carries owner_cik, the column the API's symbols filter resolves against.
How often is board_interlocks updated?
Obscura refreshes board_interlocks 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.