Obscura

EDGAR Tickers

The crosswalk between SEC CIK numbers, tickers and exchanges. The join key between EDGAR data and market prices.

edgar_tickers — the dataset name to pass to the Obscura API.

Category Regulatory Columns 6 Refresh Every weekday Entity key ticker Point-in-time available_date

What one row means

One CIK-to-ticker-to-exchange mapping entry from SEC's company_tickers_exchange.json (the join key connecting CIK-keyed EDGAR tables to symbol-keyed market-data tables). A company with multiple listed tickers/share classes produces multiple rows.

One row per (cik, ticker).

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_tickers: snapshot: available_date = COALESCE(captured_date, (synced_at AT TIME ZONE 'UTC')::date) — the day we fetched the SEC file, which carries no date/timestamp of its own. Equal to the ingestion date on a live run; on a bronze replay it is the original capture day, never the replay day.

Refresh cadence

Obscura refreshes edgar_tickers 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 — 6 columns

The full public column list for edgar_tickers, with the meaning of every field. The same schema is served unauthenticated at https://api.obscura.trade/v1/catalog/edgar_tickers.

ColumnTypeDescription
cikbigint · not nullSEC Central Index Key of the registrant; primary-key component.
tickertext · not nullExchange ticker symbol, normalized to uppercase and trimmed (empty tickers dropped); primary-key component. One CIK can have several.
nametextRegistrant company name as reported in the SEC file (nullable).
exchangetextListing exchange (e.g. Nasdaq, NYSE); nullable, empty strings stored as NULL.
captured_datedateThe UTC calendar day `company_tickers_exchange.json` was CAPTURED from SEC — `Utc::now().date_naive()` on a live run, `BronzeObject::captured_day()` on a bronze replay. The SEC file states no date of its own, so the day we fetched it is the ONLY honest availability statement, and this column is that statement. NULL on rows written before migration 000175, where `available_date` falls back to `synced_at::date` — the same value for a live capture.
available_datedatePUBLIC-availability date = `COALESCE(captured_date, (synced_at AT TIME ZONE 'UTC')::date)`. STORED generated column, read-only; the capture/snapshot date, since the source file itself carries no published date.

Access edgar_tickers

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_tickers",
    symbols=["NVDA", "AAPL"],
    start="2024-01-01",
)

Create a free account Browse all 95 datasets

Frequently asked questions

What is in the edgar_tickers dataset?

The crosswalk between SEC CIK numbers, tickers and exchanges. The join key between EDGAR data and market prices. One CIK-to-ticker-to-exchange mapping entry from SEC's company_tickers_exchange.json (the join key connecting CIK-keyed EDGAR tables to symbol-keyed market-data tables). A company with multiple listed tickers/share classes produces multiple rows.

How do I avoid look-ahead bias with edgar_tickers?

Filter on edgar_tickers.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — snapshot: available_date = COALESCE(captured_date, (synced_at AT TIME ZONE 'UTC')::date) — the day we fetched the SEC file, which carries no date/timestamp of its own. Equal to the ingestion date on a live run; on a bronze replay it is the original capture day, never the replay day. 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_tickers?

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_tickers". The column schema is public at https://api.obscura.trade/v1/catalog/edgar_tickers.

Can I filter edgar_tickers by company or symbol?

Yes. edgar_tickers carries ticker, the column the API's symbols filter resolves against.

How often is edgar_tickers updated?

Obscura refreshes edgar_tickers 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

CFTC Commitments of TradersThe CFTC's weekly Commitments of Traders report: how commercial, non-commercial and small traders are positioned in each… ECHO Enforcement CasesEnvironmental enforcement actions and penalties from the EPA's ECHO database. ECHO FacilitiesEPA-regulated facilities and their compliance history, from ECHO. EDGAR 13F FilingsMetadata for every 13F report, the quarterly filing where large institutional managers list their U.S. equity holdings. EDGAR 13F HoldingsThe line-item positions inside each 13F: which manager held which security, and how much, each quarter. EDGAR 8-K ItemsThe item numbers reported on each 8-K (5.02 officer changes, 2.01 acquisitions, 1.01 material agreements, and so on), so… EDGAR Dilution MetricsShare-issuance headroom and overhang metrics built from companies' XBRL filings: authorized versus outstanding shares, a… EDGAR Filing TextSignals mined from the text of filings, such as mentions of distress, litigation, going-concern doubt and restructuring.