Obscura

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.

Category Corporate Columns 7 Refresh Every weekday Entity key owner_cik Point-in-time available_date

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.

ColumnTypeDescription
owner_cikbigint · not nullSEC CIK of the director who sits on both boards.
directortextThe director's name (most recent value seen across filings).
company_a_cikbigint · not nullSEC CIK of the first company (the lower CIK of the pair).
company_atextTicker of the first company.
company_b_cikbigint · not nullSEC CIK of the second company (the higher CIK).
company_btextTicker of the second company.
available_datedatePUBLIC-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.

Related datasets

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. Executive CompensationExecutive pay from the Pay-versus-Performance table in proxy statements: reported and 'actually paid' compensation for t… 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.