📋 ref¶
Reference and cross-referencing tables for financial entity identification. Links SEC CIK identifiers to GLEIF LEI codes and OpenFIGI instrument identifiers. Enables cross-system entity resolution for financial data analysis.
27 datasets · 268 columns
gleif_entities · table¶
GLEIF Legal Entity Identifier (LEI) records from the Global LEI Foundation golden copy CSV — entity registration details, jurisdiction, legal form, HQ/registered addresses, and registration authority links. The registration_authority_entity_id field contains the SEC CIK number for entities registered with RA000665 (SEC EDGAR); most other registration authorities carry that jurisdiction's own business-registry number instead (e.g. RA000602, Delaware Division of Corporations), so this column is only a CIK when registration_authority_id is actually RA000665 — see gleif_cik_mapping, which applies that filter. Append-only changelog: one row per LEI per publish in which it changed, with last_update as the history axis; use the current_gleif_entities view for the latest row per LEI. Source: GLEIF Golden Copy (goldencopy.gleif.org).
| Column | Type | Null | Description |
|---|---|---|---|
lei |
string | no | Legal Entity Identifier (20-character alphanumeric) |
legal_ |
string | yes | Legal name of the entity |
legal_ |
string | yes | Language of the legal name (ISO 639-1) |
jurisdiction |
string | yes | Jurisdiction of legal formation (ISO 3166-2, e.g., US-DE) |
entity_ |
string | yes | Entity status (ACTIVE, INACTIVE, etc.) |
entity_ |
string | yes | Entity legal form code (ELF code) |
registration_ |
string | yes | Registration authority identifier (e.g., RA000665 for SEC EDGAR; RA000602 is Delaware Division of Corporations, the most common non-SEC value for US entities) |
registration_ |
string | yes | Entity ID at the registration authority (CIK for SEC registrants) |
headquarters_ |
string | yes | Country of headquarters (ISO 3166-1 alpha-2) |
headquarters_ |
string | yes | City of headquarters |
registered_ |
string | yes | Country of legal registration (ISO 3166-1 alpha-2) |
registered_ |
string | yes | City of legal registration |
registration_ |
string | yes | Initial LEI registration date (ISO 8601) |
last_ |
string | yes | Last update date of the LEI record (ISO 8601) |
next_ |
string | yes | Next renewal date for the LEI (ISO 8601) |
gleif_cik_mapping · table¶
Bridge table mapping GLEIF LEI codes to SEC CIK numbers (lei, cik, legal_name, entity_status). Derived from the GLEIF golden copy CSV filtered where registration_authority_id = 'RA000665' (SEC EDGAR). That authority ID covers both real filer CIKs and SEC fund-series identifiers (e.g. "S000005113") registered with SEC but not themselves filers — a validator drops any non-numeric cik value, since a series ID never matches a real CIK downstream. Current snapshot only, overwritten each run — unlike gleif_entities, which keeps an append-only change history. Provides fast LEI <-> CIK lookups without scanning the full GLEIF dataset. entity_org_bridge.sec_cik (EIN-path matches) joins here on cik = sec_cik to reach the LEI — the exact bridge for that column; do not name-match its org against gleif_entities.legal_name.
| Column | Type | Null | Description |
|---|---|---|---|
lei |
string | no | Legal Entity Identifier (20-character alphanumeric) |
cik |
string | no | SEC Central Index Key (CIK) number |
legal_ |
string | yes | Legal name of the entity |
entity_ |
string | yes | Entity status (ACTIVE, INACTIVE, etc.) |
gleif_relationships · table¶
GLEIF Level 2 relationship records — the LEI-to-LEI edges that LEI-CDF (gleif_entities) does not carry. One row per directed relationship. Both endpoints are always LEIs, so the table self-joins to gleif_entities on either side and, through gleif_cik_mapping, resolves to SEC CIKs. relationship_type values (2026-07-31 publish, 482,849 rows): IS_DIRECTLY_CONSOLIDATED_BY (126,021) and IS_ULTIMATELY_CONSOLIDATED_BY (132,196) are the two levels of the ownership hierarchy; IS_FUND-MANAGED_BY (148,576), IS_SUBFUND_OF (72,731), IS_FEEDER_TO (1,386) are fund structures; IS_INTERNATIONAL_BRANCH_OF (1,939) is branch registration. In every type start_node_id is the subordinate entity and end_node_id is the superior one — but only consolidation means ownership. A fund commonly carries a manager AND an umbrella (59,419 entities; the two are different entities in 60,266 of 60,370 cases): two distinct relations, not two parents. GLEIF flattens the ownership chain to two attested levels and never publishes the intermediate one, so IS_ULTIMATELY_CONSOLIDATED_BY is largely derivable — walking the direct chain reaches the declared ultimate for 113,860 of the 118,627 entities that report both. It is kept because it is REPORTED, not computed: 13,569 entities declare an ultimate with no direct edge to walk from, and 4,765 chains break at an intermediate holding company that has no LEI. Dropping it loses those ~18k attestations. Only entities that report a relationship to GLEIF appear here — an absent edge means "not reported", which the REPEX (reporting exception) publish explains and this table does not carry. Source: GLEIF Golden Copy RR (goldencopy.gleif.org).
| Column | Type | Null | Description |
|---|---|---|---|
start_ |
string | no | LEI of the subordinate entity in the relationship (start_node_id_type is LEI on all 482,849 rows) |
start_ |
string | yes | Node identifier scheme; LEI throughout the current publish |
end_ |
string | no | LEI of the superior entity in the relationship |
end_ |
string | yes | Node identifier scheme; LEI throughout the current publish |
relationship_ |
string | no | IS_DIRECTLY_CONSOLIDATED_BY, IS_ULTIMATELY_CONSOLIDATED_BY, IS_FUND-MANAGED_BY, IS_SUBFUND_OF, IS_FEEDER_TO, IS_INTERNATIONAL_BRANCH_OF |
relationship_ |
string | yes | ACTIVE or INACTIVE |
period_ |
string | yes | |
period_ |
string | yes | |
period_ |
string | yes | |
period_ |
string | yes | |
period_ |
string | yes | |
period_ |
string | yes | |
period_ |
string | yes | |
period_ |
string | yes | |
period_ |
string | yes | |
period_ |
string | yes | |
period_ |
string | yes | |
period_ |
string | yes | |
period_ |
string | yes | |
period_ |
string | yes | |
period_ |
string | yes | |
qualifier_ |
string | yes | |
qualifier_ |
string | yes | |
qualifier_ |
string | yes | |
qualifier_ |
string | yes | |
qualifier_ |
string | yes | |
qualifier_ |
string | yes | |
qualifier_ |
string | yes | |
qualifier_ |
string | yes | |
qualifier_ |
string | yes | |
qualifier_ |
string | yes | |
quantifier_ |
string | yes | |
quantifier_ |
string | yes | |
quantifier_ |
string | yes | |
quantifier_ |
string | yes | |
quantifier_ |
string | yes | |
quantifier_ |
string | yes | |
quantifier_ |
string | yes | |
quantifier_ |
string | yes | |
quantifier_ |
string | yes | |
quantifier_ |
string | yes | |
quantifier_ |
string | yes | |
quantifier_ |
string | yes | |
quantifier_ |
string | yes | |
quantifier_ |
string | yes | |
quantifier_ |
string | yes | |
registration_ |
string | yes | |
registration_ |
string | yes | Last update of the relationship record (ISO 8601) — the computed_delta change key |
registration_ |
string | yes | PUBLISHED, LAPSED, PENDING_ARCHIVAL or PENDING_TRANSFER — lifecycle of the relationship record itself |
registration_ |
string | yes | |
registration_ |
string | yes | LEI of the Local Operating Unit maintaining the record |
registration_ |
string | yes | FULLY_CORROBORATED, PARTIALLY_CORROBORATED or ENTITY_SUPPLIED_ONLY |
registration_ |
string | yes | |
registration_ |
string | yes |
sec_company_tickers · table¶
SEC EDGAR company ticker mapping: cik, ticker, title (registered company name), and as_of (the UTC ingest date). ~10,000 active US exchange-listed companies, sourced from the SEC EDGAR company_tickers.json file (updated daily). Each run stamps a fresh as_of snapshot, so grouping by as_of recovers ticker/name history over time. Feeds the ticker dimension for figi_instruments — enables the full chain LEI → CIK → ticker → FIGI within the ref schema with no dependency on other schemas. Source: https://www.sec.gov/files/company_tickers.json
| Column | Type | Null | Description |
|---|---|---|---|
cik |
string | no | SEC Central Index Key (plain numeric string, matches gleif_cik_mapping.cik) |
ticker |
string | no | Exchange ticker symbol |
title |
string | yes | Company name as registered with SEC |
as_ |
date | no | Ingest date this snapshot was materialized (UTC today; group by for history) |
figi_instruments · table¶
Financial instrument identifiers from OpenFIGI. Maps tickers to FIGI codes with exchange, market sector, and security type information. Requires an OpenFIGI API key (set OPENFIGI_API_KEY environment variable). Rate limited to 25 requests/minute with API key, 5 requests/minute without.
| Column | Type | Null | Description |
|---|---|---|---|
figi |
string | no | Financial Instrument Global Identifier (12-character) |
ticker |
string | yes | Trading ticker symbol |
name |
string | yes | Instrument name |
exchange_ |
string | yes | Exchange code (e.g., US, LN, JP) |
market_ |
string | yes | Market sector (Equity, Govt, Corp, etc.) |
security_ |
string | yes | Security type (Common Stock, ADR, ETF, etc.) |
security_ |
string | yes | Secondary security type classification |
security_ |
string | yes | Security description |
composite_ |
string | yes | Composite FIGI (country-level aggregate identifier) |
share_ |
string | yes | Share class FIGI |
countries · table¶
Country identity crosswalk: one row per country carrying the Census 4-digit trade code, ISO 3166-1 alpha-2/alpha-3/numeric, FIPS 10-4, a name-based BEA area key, plus M49 region/subregion/continent and ISO 4217 currency. Lets the Census-coded trade tables (econ.trade_by_state / trade_exports / trade_imports), the ISO-3-coded econ.world_indicators, and the name-keyed BEA tables (econ.ita_data / fdi_*) all join to a single reference. Sources: Census Schedule C country list (live, freshness-gated) + a bundled ISO spine derived from DataHub datasets/country-codes (public domain).
| Column | Type | Null | Description |
|---|---|---|---|
census_ |
string | no | Census 4-digit foreign-trade country code (FK target for the trade tables) |
iso_ |
string | yes | ISO 3166-1 alpha-2 code |
iso_ |
string | yes | ISO 3166-1 alpha-3 code |
iso_ |
string | yes | ISO 3166-1 numeric code |
fips_ |
string | yes | FIPS 10-4 country code |
country_ |
string | yes | Census display name (clean short form) |
official_ |
string | yes | ISO English official name |
bea_ |
string | yes | country_name with any parenthetical stripped; best-effort join key for BEA area_or_country |
currency_ |
string | yes | ISO 4217 currency alphabetic code |
region |
string | yes | M49 region (e.g. Americas, Europe) |
subregion |
string | yes | M49 sub-region (e.g. Northern America) |
intermediate_ |
string | yes | M49 intermediate region (nullable) |
continent |
string | yes | Continent code (e.g. NA, EU, AS) |
is_ |
boolean | yes | True when the Census row is a grouping/area with no single ISO country |
naics · table¶
NAICS 2022 industry classification: one row per 2-to-6-digit code with its title and hierarchy level (2=sector, 3=subsector, 4=industry group, 5=NAICS industry, 6=national industry). Sector codes retain the Census range form (e.g. '31-33' manufacturing). Canonical FK target for naics_code across census/econ/environment. Source: Census 2022 NAICS code list.
| Column | Type | Null | Description |
|---|---|---|---|
naics_ |
string | no | 2-6 digit NAICS code (sectors may be a range, e.g. '31-33') |
naics_ |
string | no | Industry title |
level |
integer | no | Hierarchy depth = number of digits in the base code (2=sector … 6=national industry) |
naics_vintage · table¶
Multi-edition NAICS classification: one row per 2-6 digit code PER vintage (edition year). Use for period-correct industry lookups — join fact.year to ref.naics_vintage_map to pick the edition, then join on (naics_vintage, naics_code). For the single current-edition FK spine use ref.naics. Source: Census per-edition code lists (editions 2017, 2022).
| Column | Type | Null | Description |
|---|---|---|---|
vintage |
integer | no | NAICS edition year (e.g. 2017, 2022) |
naics_ |
string | no | 2-6 digit NAICS code (sectors may be a range, e.g. '31-33') |
naics_ |
string | no | Industry title for this code in this edition |
level |
integer | no | Hierarchy depth = number of digits in the base code (2=sector … 6=national industry) |
naics_vintage_map · table¶
Data-year to applicable NAICS edition. Join fact.year = naics_vintage_map.data_year to resolve naics_vintage, then join ref.naics_vintage on (naics_vintage, naics_code) for the period-correct title. Loaded editions: 2017, 2022; years before the earliest loaded edition map to it (documented fallback — refine when older editions are sourced).
| Column | Type | Null | Description |
|---|---|---|---|
data_ |
integer | no | Calendar/data year |
naics_ |
integer | no | NAICS edition year in effect for data_year (matches ref.naics_vintage.vintage) |
sic · table¶
SEC EDGAR Standard Industrial Classification codes: one row per 4-digit SIC code with its EDGAR Assistant-Director office and industry title. FK target for sec.filing_metadata.sic_code. Source: SEC EDGAR siccodes list.
| Column | Type | Null | Description |
|---|---|---|---|
sic_ |
string | no | 4-digit SIC code, zero-padded (e.g. '0100', '7372') |
ad_ |
string | yes | EDGAR Assistant-Director office / industry group that reviews filers in this SIC |
industry_ |
string | no | SIC industry title (SEC EDGAR display form) |
currencies · table¶
ISO 4217 active currencies: one row per alphabetic code with its name, numeric code, and minor-unit (decimal places). FK target for ref.countries.currency_code. Withdrawn codes are excluded. Source: ISO 4217 (datasets/currency-codes).
| Column | Type | Null | Description |
|---|---|---|---|
currency_ |
string | no | ISO 4217 3-letter alphabetic code (e.g. 'USD') |
currency_ |
string | no | Currency name (e.g. 'US Dollar') |
numeric_ |
string | yes | ISO 4217 3-digit numeric code, zero-padded (e.g. '840') |
minor_ |
integer | yes | Number of decimal places in the minor unit (e.g. 2 for cents; null when not applicable) |
calendar · table¶
Daily date spine from 2010-01-01 through two years past the current year, one row per calendar day. The full-date representations (date_key, iso_date, basic_iso YYYYMMDD, iso_ordinal YYYY-DDD, iso_week_date YYYY-Www-D, epoch_day) are each unique and serve as FK targets for date columns in any form. Also carries numeric and named date parts, calendar flags, and US-federal fiscal attributes (fiscal_year FKs ref.fiscal_year). Generated by CalendarDataProvider — no external source.
| Column | Type | Null | Description |
|---|---|---|---|
date_ |
date | no | Calendar day as a native DATE (canonical FK target for DATE-typed columns) |
iso_ |
string | no | ISO-8601 calendar date YYYY-MM-DD (FK target for ISO date strings) |
basic_ |
string | no | ISO-8601 basic date YYYYMMDD (FK target for compact date stamps) |
iso_ |
string | no | ISO-8601 ordinal date YYYY-DDD |
iso_ |
string | no | ISO-8601 week date YYYY-Www-D |
epoch_ |
long | no | Days since 1970-01-01 (numeric full-date form) |
year |
integer | no | Calendar year |
quarter |
integer | no | Calendar quarter (1-4) |
month |
integer | no | Month of year (1-12) |
day_ |
integer | no | Day of month (1-31) |
day_ |
integer | no | ISO day of week (1=Monday .. 7=Sunday) |
day_ |
integer | no | US day of week (1=Sunday .. 7=Saturday) |
day_ |
integer | no | Day of year (1-366) |
day_ |
integer | no | Day of quarter (1-92) |
iso_ |
integer | no | ISO-8601 week of week-based year (1-53) |
iso_ |
integer | no | ISO-8601 week-based year (may differ from year near Jan/Dec boundaries) |
days_ |
integer | no | Number of days in this month |
month_ |
string | no | Full month name (English, e.g. January) |
month_ |
string | no | Abbreviated month name (English, e.g. Jan) |
day_ |
string | no | Full weekday name (English, e.g. Monday) |
day_ |
string | no | Abbreviated weekday name (English, e.g. Mon) |
year_ |
string | no | Month-grain key YYYY-MM |
year_ |
string | no | Quarter-grain key YYYY-Qn |
year_ |
string | no | ISO week-grain key YYYY-Www |
is_ |
boolean | no | True on Saturday or Sunday |
is_ |
boolean | no | True Monday through Friday |
is_ |
boolean | no | True on the first day of the month |
is_ |
boolean | no | True on the last day of the month |
is_ |
boolean | no | True on the first day of the quarter |
is_ |
boolean | no | True on the last day of the quarter |
is_ |
boolean | no | True on January 1 |
is_ |
boolean | no | True on December 31 |
is_ |
boolean | no | True when the calendar year is a leap year |
fiscal_ |
integer | no | US federal fiscal year (starts Oct 1; FK to fiscal_year.fiscal_year) |
fiscal_ |
integer | no | US federal fiscal quarter (1=Oct-Dec .. 4=Jul-Sep) |
fiscal_ |
integer | no | US federal fiscal month (1=October .. 12=September) |
fiscal_ |
string | no | Fiscal year label, e.g. FY2024 |
day_ |
integer | no | Day of the federal fiscal year (1-366, from Oct 1) |
fiscal_year · table¶
US federal fiscal-year dimension: one row per fiscal year (FY starts Oct 1, labelled by the calendar year it ends — FY2024 = 2023-10-01..2024-09-30). Boundary and per-quarter start dates are ISO strings that join to ref.calendar. Conformed FK target for fiscal_year across schemas (ref.calendar.fiscal_year references it). Generated by FiscalYearDataProvider — no external source. Covers FY2010 through two years past the current fiscal year.
| Column | Type | Null | Description |
|---|---|---|---|
fiscal_ |
integer | no | US federal fiscal year (e.g. 2024 = 2023-10-01..2024-09-30) |
fiscal_ |
string | no | Fiscal year label, e.g. FY2024 |
start_ |
date | no | First day of the fiscal year (Oct 1 of the prior calendar year) |
end_ |
date | no | Last day of the fiscal year (Sep 30) |
start_ |
string | no | start_date as ISO YYYY-MM-DD (FK to calendar.iso_date) |
end_ |
string | no | end_date as ISO YYYY-MM-DD (FK to calendar.iso_date) |
calendar_ |
string | no | Spanning calendar years, e.g. 2023-2024 |
days_ |
integer | no | Number of days in the fiscal year (365 or 366) |
q1_ |
string | no | Fiscal Q1 start (Oct 1) as ISO YYYY-MM-DD |
q2_ |
string | no | Fiscal Q2 start (Jan 1) as ISO YYYY-MM-DD |
q3_ |
string | no | Fiscal Q3 start (Apr 1) as ISO YYYY-MM-DD |
q4_ |
string | no | Fiscal Q4 start (Jul 1) as ISO YYYY-MM-DD |
prior_ |
integer | no | The preceding fiscal year |
next_ |
integer | no | The following fiscal year |
holidays · table¶
Public holidays for every country supported by the Nager.Date API (~110), one row per (country, holiday) per year. Joins to ref.calendar via holiday_date (ISO YYYY-MM-DD) and to ref.countries via country_code (ISO 3166-1 alpha-2). Generated by HolidaysDataProvider, which pulls /api/v3/AvailableCountries then /api/v3/PublicHolidays/{year}/{country}. Source: date.nager.at (free, no API key).
| Column | Type | Null | Description |
|---|---|---|---|
country_ |
string | no | ISO 3166-1 alpha-2 country code (FK to countries.iso_alpha2) |
country_ |
string | yes | English country name (Nager AvailableCountries) |
holiday_ |
string | no | Holiday date ISO YYYY-MM-DD (FK to calendar.iso_date) |
holiday_ |
string | no | Holiday name in English |
local_ |
string | yes | Holiday name in the local language |
is_ |
boolean | yes | True when the holiday applies nationwide (not subdivision-scoped) |
is_ |
boolean | yes | True when the holiday falls on the same calendar date every year |
counties |
string | yes | Comma-separated ISO-3166-2 subdivisions when the holiday is regional (else null) |
launch_ |
integer | yes | Year the holiday was first observed, when known |
holiday_ |
string | yes | Comma-separated Nager holiday types (Public, Bank, Optional, ...) |
entity_org_bridge · table¶
Tall audit/match log: one row per (source_schema, source_table, source_column, source_key) org-name mention, carrying its best-match LEI (via GLEIF fuzzy/exact match) or SEC CIK (via EIN exact match against sec.filing_metadata.irs_number). Rebuilt in full every run by EntityBridgeListener from the org-type source registry (fec, patents, sec, health, environment, energy, transport, fiscal). Absence of a row below match_score 0.85 is a clean "no confident match" signal, not a data gap. Primary consumers should generally query canonical_org_entity instead; use this table when the full audit trail or per-source detail matters.
| Column | Type | Null | Description |
|---|---|---|---|
source_ |
string | no | Owning AskAmerica schema, e.g. 'fec', 'patents', 'sec' |
source_ |
string | no | Source table name, e.g. 'committees', 'patent_assignees' |
source_ |
string | no | Name column matched, e.g. 'connected_org_name'; disambiguates same-table dual-role columns (eia_coal_mines controller_name vs operator_name) |
source_ |
string | no | Registry key_column value; the normalized name itself for unstructured (name-only) sources |
source_ |
string | yes | Original source name, for audit |
source_ |
string | yes | Normalized name (lowercase, punctuation/legal-suffix stripped), for debugging match misses |
lei |
string | yes | GLEIF Legal Entity Identifier, populated for GLEIF-path matches |
sec_ |
string | yes | SEC CIK, populated for EIN-path matches via sec.filing_metadata.irs_number. To reach this CIK's GLEIF LEI, join ref.gleif_cik_mapping on cik = sec_cik — that table is the exact bridge (RA000665-filtered GLEIF golden copy); do not name-match sec_cik's org against gleif_entities.legal_name. |
gleif_ |
string | yes | Denormalized from ref.gleif_entities, avoids a join for the common case |
match_ |
string | no | exact_ein | exact_normalized | fuzzy |
match_ |
string | no | high | low | ambiguous. high/low apply to fuzzy matches (score-threshold split); exact_ein is always high (EIN->CIK is 1:1 by construction). exact_normalized is high only when the normalized name resolves to exactly one GLEIF LEI; when it resolves to more than one (Defect Register B2-1 -- e.g. 6 distinct LEIs shared source_name_normalized='apple' before this fix), every candidate row is still written but labelled ambiguous rather than asserted as equally high-confidence. |
match_ |
double | no | 1.0 for exact; raw jaro_winkler_similarity for fuzzy |
match_ |
string | no | ISO timestamp of the build run, so bridge quality is diffable across reruns |
entity_person_bridge · table¶
Tall N-way pairwise person-match log across person-type sources (fec.candidates, sec.insider_transactions individual-type rows, health.cms_open_payments, transport.faa_aircraft_registry individual-type registrants). One row per matched pair of source entities; only holds rows where a match was found — most people known to one source are never in another, so a "no match" majority is expected and not written. A person appearing in 3+ sources yields multiple pairwise rows rather than one N-ary row. Rebuilt in full every run.
| Column | Type | Null | Description |
|---|---|---|---|
source_ |
string | no | First side of the match — owning schema |
source_ |
string | no | First side of the match — source table |
source_ |
string | no | First side of the match — registry key_column value |
source_ |
string | yes | First side of the match — original raw name |
source_ |
string | no | Second side of the match — owning schema |
source_ |
string | no | Second side of the match — source table |
source_ |
string | no | Second side of the match — registry key_column value |
source_ |
string | yes | Second side of the match — original raw name |
match_ |
string | no | exact_normalized | fuzzy_first_name |
match_ |
string | no | high | low — low is never silently promoted |
match_ |
double | no | First-name jaro_winkler_similarity for fuzzy rows; 1.0 for exact |
match_ |
string | no | ISO timestamp, diffable across reruns |
canonical_org_entity · table¶
THE CROSS-SOURCE JOIN TABLE FOR ORGANISATIONS — a wide crosswalk you join on, carrying one nullable foreign key per source alongside a _confidence sibling for each. Use it to define a SET by exact predicate rather than by matching names: "every firm that files with the SEC and holds patents" is WHERE sec_cik IS NOT NULL AND patents_assignee_id IS NOT NULL, then a direct join to sec.filing_metadata on cik and patents.patent_assignees on assignee_id. No name matching, no match rate, no candidate review. The resolve_entity tool is for the other case — a person handed you one name and you need its keys. One row per SOURCE MENTION, not per real-world org: a company whose patents are split across three assignee_ids gets three rows, all sharing one canonical_entity_id and canonical_name, each carrying a different patents_assignee_id. Identity columns (canonical_name, lei, sec_cik) are resolved across the whole org and repeated on every one of its rows, so a cross-source predicate still matches on a single row — and now returns every key a source holds for that org rather than one arbitrary representative. COUNT rows here and you are counting mentions; COUNT DISTINCT canonical_entity_id to count organisations. An org identified only in patents.patent_assignees (never resolved) still gets a row, with lei left null. Nullable FK columns point at each source's natural key; a "_confidence" sibling column (high | low | null) accompanies every FK. Consumer tables, each carrying a cross-reference back to its own FK column here: fec.committees (fec_committee_id), sec.insider_transactions (sec_reporting_person_cik), sec.institutional_holdings (sec_manager_cik), patents.patent_assignees (patents_assignee_id), patents.trademark_owner (patents_trademark_owner_id), health.fda_drug_approvals (fda_sponsor_name), health.fda_drug_recalls (fda_drug_recalling_firm), health.fda_device_recalls (fda_device_recalling_firm), health.fda_ndc_products (fda_labeler_name), health.cms_open_payments (cms_paying_entity_name), health.clinical_trials (clinical_trials_nct_id), environment.ghg_facilities (ghg_parent_company_name), energy.eia_utility_annual (eia_utility_id), energy.eia_coal_mines (eia_coal_controller_name, eia_coal_operator_name), transport.fmcsa_carriers (fmcsa_dot_number), transport.faa_aircraft_registry (faa_registrant_name), fiscal.exempt_org_master (exempt_org_ein), fiscal.sba_loan_approvals (sba_borrower_name, sba_lender_name), research.nsf_herd_by_institution (nsf_herd_inst_id), edu.ipeds_institutions (ipeds_unitid). Structured-key sources (a per-row id/CIK/EIN already on the source table — fec_committee_id, sec_reporting_person_cik, sec_manager_cik, patents_assignee_id, patents_trademark_owner_id, eia_utility_id, fmcsa_dot_number, exempt_org_ein, clinical_trials_nct_id, ipeds_unitid) get an exact join here on that id; unstructured sources (name-only, no per-row id) get the fuzzy-resolved identity this table already carries, so a cross-schema link still avoids re-running the fuzzy match by hand.
| Column | Type | Null | Description |
|---|---|---|---|
canonical_ |
string | no | Surrogate PK — the LEI when present; the SEC CIK when EIN-matched but no LEI; else a deterministic hash of the first-seen (source_schema, source_table, source_column, source_key) |
canonical_ |
string | yes | GLEIF legal_name when lei is populated, else the longest/most-complete raw source name seen |
lei |
string | yes | |
sec_ |
string | yes | Via EIN exact match against sec.filing_metadata.irs_number |
fec_ |
string | yes | Scalar FK, safe 1:1 — a committee represents one org |
fec_ |
string | yes | |
sec_ |
string | yes | Entity-type SEC insiders — SEC's own stable per-filer ID, safe 1:1 |
sec_ |
string | yes | |
patents_ |
string | yes | PatentsView assignee_id. Its disambiguation is imperfect, so one company can hold several — measured 5,224 companies split across 13,650 ids, one holding 78. Each gets its own row (see this table's grain), so joining patents.patent_assignees on this column reaches all of a company's patents. |
patents_ |
string | yes | |
fda_ |
string | yes | Unstructured source, keyed by normalized name |
fda_ |
string | yes | |
ghg_ |
string | yes | Unstructured source, keyed by normalized name |
ghg_ |
string | yes | |
cms_ |
string | yes | Unstructured source, keyed by normalized name |
cms_ |
string | yes | |
eia_ |
string | yes | |
eia_ |
string | yes | |
eia_ |
string | yes | Mine controller — logically distinct from operator, same source table |
eia_ |
string | yes | |
eia_ |
string | yes | Mine operator — logically distinct from controller, same source table |
eia_ |
string | yes | |
fmcsa_ |
string | yes | Lossy potential given ~4.47M-row source scale — see table comment |
fmcsa_ |
string | yes | |
faa_ |
string | yes | Unstructured, entity-type registrants only (registrant_type != Individual) |
faa_ |
string | yes | |
exempt_ |
string | yes | EIN exact-match hub key, alongside GLEIF LEI |
exempt_ |
string | yes | |
sba_ |
string | yes | Unstructured, distinct role from lender on the same source table |
sba_ |
string | yes | |
sba_ |
string | yes | Unstructured, distinct role from borrower on the same source table |
sba_ |
string | yes | |
sec_ |
string | yes | Form 13F institutional investment manager, SEC's own stable per-filer ID |
sec_ |
string | yes | |
patents_ |
string | yes | USPTO trademark applicant/owner (own_id), org-shaped rows |
patents_ |
string | yes | |
fda_ |
string | yes | Structural twin of fda_drug_recalling_firm below, for medical device recalls |
fda_ |
string | yes | |
fda_ |
string | yes | Lossy potential — product_ndc is per-product, many products share one labeler |
fda_ |
string | yes | |
nsf_ |
string | yes | NSF HERD survey institution; ipeds_unitid below is the same real institution via a different registry |
nsf_ |
string | yes | |
ipeds_ |
string | yes | NCES IPEDS institution directory |
ipeds_ |
string | yes | |
clinical_ |
string | yes | ClinicalTrials.gov lead sponsor |
clinical_ |
string | yes | |
fda_ |
string | yes | FDA drug (not device) recall — recall_number is per-recall, not per-firm |
fda_ |
string | yes |
canonical_person_entity · table¶
One row per real-world person known to any person-type registry source, whether or not they cross-matched another source. A row with 2+ FKs populated is a person-track match (e.g. a political candidate who is also a corporate insider); a row with only one FK populated is simply "known to that one source, never cross-matched" — both are legitimate outcomes. No third-party canonical individual registry exists (unlike GLEIF for orgs), so these FKs are direct pairwise links between source pools, not resolutions to an external hub.
| Column | Type | Null | Description |
|---|---|---|---|
canonical_ |
string | no | Surrogate PK — deterministic hash of the first-seen source key; no external hub key exists for individuals |
canonical_ |
string | yes | Best-available parsed (first, last) name |
fec_ |
string | yes | |
fec_ |
string | yes | |
sec_ |
string | yes | Already 1:1 by SEC's own construction |
sec_ |
string | yes | |
cms_ |
string | yes | Already 1:1 by CMS's own construction |
cms_ |
string | yes | |
faa_ |
string | yes | Unstructured, individual-type registrants only |
faa_ |
string | yes | |
patents_ |
string | yes | patents.patent_assignees rows where assignee_type is '4' (US individual) or '5' (foreign individual) — a patent assigned directly to a person rather than a company. Distinct from the org-track's patents_assignee_id (canonical_org_entity), which only covers assignee_type '2'/'3' (company rows). |
patents_ |
string | yes | |
officials_ |
string | yes | House/Senate member, Congress.gov's own stable per-member ID |
officials_ |
string | yes | |
officials_ |
string | yes | Article III federal judge, FJC's own stable per-judge ID |
officials_ |
string | yes |
ticker_instrument_map · view¶
Connects OpenFIGI instruments to SEC filers via shared ticker symbol. One row per ticker+figi combination — enables instrument-to-company resolution and cross-referencing FIGI, CIK, and company name for equity analysis. Self-contained within the ref schema; no dependency on other schemas.
View — columns are resolved by the query engine at runtime.
current_naics · view¶
Current NAICS edition — the latest vintage in naics_vintage. Tracks the newest loaded edition automatically (ref.naics remains the materialized current-edition FK spine; use this view when working from the vintage table). See naics_vintage_map for period-correct (non-current) edition selection.
View — columns are resolved by the query engine at runtime.
current_gleif_entities · view¶
Current-state GLEIF entities: the latest row per LEI (max last_update) from the append-only gleif_entities changelog. Use for "as-now" lookups; query gleif_entities directly (group by last_update) for point-in-time / history.
View — columns are resolved by the query engine at runtime.
current_gleif_relationships · view¶
Current-state GLEIF relationships: the latest row per (start_node_id, relationship_type) from the append-only gleif_relationships changelog, raw source columns unchanged. Use for "as-now" walks; query gleif_relationships directly (group by registration_last_update) to see when an edge changed.
View — columns are resolved by the query engine at runtime.
current_gleif_parents · view¶
The convenience shape over the raw relationship rows — this is where the repeating Period / Qualifier / Quantifier slots are collapsed, deliberately in SQL rather than baked into the stored table, so the selection rules can change without a re-ingest. Restricted to the two ownership types (fund, branch and feeder edges excluded), to ACTIVE relationships whose record is still PUBLISHED, with legal name and jurisdiction resolved on both ends. One row per (child, IS_DIRECTLY_CONSOLIDATED_BY | IS_ULTIMATELY_CONSOLIDATED_BY) — an entity can appear twice, once for its immediate parent and once for the top of its group. Join child_lei or parent_lei to gleif_cik_mapping to reach SEC filers.
View — columns are resolved by the query engine at runtime.
gleif_ownership_ancestry · view¶
Full multi-hop ownership chain per entity, walking IS_DIRECTLY_CONSOLIDATED_BY edges from current_gleif_relationships (ACTIVE/PUBLISHED only) via a recursive CTE. GLEIF's own IS_ULTIMATELY_CONSOLIDATED_BY shortcut reports only the top of the chain and hides every intermediate holding company: HSBC Bank USA sits 4 hops below HSBC Holdings plc via direct edges (HSBC USA Inc. -> HSBC North America Holdings Inc. -> HSBC Overseas Holdings (UK) Ltd. -> HSBC Holdings plc), but IS_ULTIMATELY_CONSOLIDATED_BY reports that as one hop. One row per (entity, ancestor): lei is the entity being looked up, immediate_parent_lei is that entity's own direct parent (constant across all of its rows), ancestor_lei is the entity found at this depth (1 = immediate parent), path is the full lei chain from lei to ancestor_lei inclusive, and ancestor_is_ultimate is true when ancestor_lei has no further direct parent of its own. The cycle guard (path exclusion, plus a depth<50 backstop) is load -bearing: nothing upstream guarantees the direct-consolidation edges are acyclic. Live- verified: 116,978 rows / 89,392 distinct entities / max depth 9 over the full forest.
View — columns are resolved by the query engine at runtime.
org_entity_sec · view¶
Defect Register Recommendation 1. canonical_org_entity's own sec_cik column is populated only via exact EIN match (Defect B2-2 — that path currently has no EIN-bearing SEC-side source wired in and so is effectively always null); this view reaches the same destination today via the LEI both tables already carry. If sec_cik is backfilled directly (B2-2), this view becomes redundant with querying canonical_org_entity alone — that is the intended outcome, not a problem; this view exists to make the connection reachable in the meantime. cik_via_gleif is deliberately named apart from the source sec_cik column so a caller can see which path produced which value while both exist side by side.
View — columns are resolved by the query engine at runtime.
org_entity_ultimate_parent · view¶
Defect Register Recommendation 2. Rolls each canonical org up to its ultimate GLEIF parent (IS_ULTIMATELY_CONSOLIDATED_BY only — see current_gleif_parents for the direct-parent edge too), falling back to the entity itself where no such edge exists so every input row still produces one output row. Without this, a firm's activity comes back split across every subsidiary that files under its own name — measured live: Capital One's patents are 96% under "Capital One Services, LLC" and the rest under "Capital One Financial Corporation", so grouping by the raw entity name alone undercounts the parent by roughly 29x.
View — columns are resolved by the query engine at runtime.
patent_assignee_firm · view¶
Defect Register Recommendation 3, corrected scope: not a four-hop join (canonical_org_entity already carries both patents_assignee_id and sec_cik directly), but it does pre-resolve the one genuine extra hop — the ultimate parent — via org_entity_ultimate_parent, so patent output rolls up to the filing parent rather than staying split across subsidiaries (see that view's comment for the measured Capital One case). Known limitation carried from Defect Register B2-4: canonical_org_entity.patents_assignee_id picks one assignee_id arbitrarily when a name maps to several (measured: Schlumberger links to an id with 1 patent instead of a sibling id with 10,227) — this view inherits that until B2-4 lands.
View — columns are resolved by the query engine at runtime.