Government Contract Tickers
A crosswalk from federal-contract recipient names to ticker symbols, so government awards can be matched to public companies.
gov_contract_tickers — the dataset name to pass to the Obscura API.
What one row means
One recipient-name-to-ticker match: a distinct USAspending federal-contract recipient name that, after normalization (uppercase, strip punctuation and corporate suffixes like INC/CORP/LLC), exact-matches a normalized EDGAR company name, paired with that company's ticker and CIK — a derived crosswalk row, not a contract or event record. Built by normalizing recipient names against the EDGAR ticker dictionary so `usaspending_awards` can be joined per-ticker.
One row per recipient_name.
Derived in-database from edgar_tickers, usaspending_awards.
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 gov_contract_tickers: synced (ingestion/recompute time): available_date = synced_at::date — there is no source event to key on, this is a pure derived crosswalk recomputed and fully upserted on every run.
Refresh cadence
Obscura refreshes gov_contract_tickers 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 — 5 columns
The full public column list for gov_contract_tickers, with the meaning of every field. The same
schema is served unauthenticated at https://api.obscura.trade/v1/catalog/gov_contract_tickers.
| Column | Type | Description |
|---|---|---|
| recipient_name | text · not null | Raw (non-normalized) USAspending recipient name as it appears in `usaspending_award.recipient_name`, e.g. "THE GEO GROUP, INC.". Primary/conflict key of the table — one row per distinct recipient name that found a match, upserted in place on every run. |
| ticker | text · not null | Stock ticker of the matched EDGAR-listed company, taken from `edgar_ticker.ticker` for the dictionary entry whose normalized name equals the recipient's normalized name. On a normalization collision, the shorter ticker string wins (a heuristic tie-break, not a guarantee of the "primary" class). |
| cik | bigint · not null | SEC Central Index Key of the matched company, copied from `edgar_ticker.cik` for the same dictionary entry that supplied `ticker`. Lets the row join directly to edgar_filings/edgar_ticker without a second name-matching pass. |
| matched_name | text | The original (pre-normalization) EDGAR company display name that the recipient matched against, e.g. "GEO GROUP INC" for recipient "THE GEO GROUP, INC.". Stored so a human can audit why a match fired without re-deriving the normalization. |
| available_date | date | PUBLIC-availability date = the date-part of `synced_at`: the day this recipient-to-ticker match was last (re)computed and made available. DB-generated, read-only. There is no underlying contract, filing, or period event for this table to key on instead — the crosswalk is a snapshot fact, so `available_date` correctly tracks recompute day rather than any source event date. |
Access gov_contract_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="gov_contract_tickers",
symbols=["NVDA", "AAPL"],
start="2024-01-01",
)
Create a free account Browse all 95 datasets
Frequently asked questions
What is in the gov_contract_tickers dataset?
A crosswalk from federal-contract recipient names to ticker symbols, so government awards can be matched to public companies. One recipient-name-to-ticker match: a distinct USAspending federal-contract recipient name that, after normalization (uppercase, strip punctuation and corporate suffixes like INC/CORP/LLC), exact-matches a normalized EDGAR company name, paired with that company's ticker and CIK — a derived crosswalk row, not a contract or event record. Built by normalizing recipient names against the EDGAR ticker dictionary so `usaspending_awards` can be joined per-ticker.
How do I avoid look-ahead bias with gov_contract_tickers?
Filter on gov_contract_tickers.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — synced (ingestion/recompute time): available_date = synced_at::date — there is no source event to key on, this is a pure derived crosswalk recomputed and fully upserted on every run. A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.
In what formats can I get gov_contract_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="gov_contract_tickers". The column schema is public at https://api.obscura.trade/v1/catalog/gov_contract_tickers.
Can I filter gov_contract_tickers by company or symbol?
Yes. gov_contract_tickers carries ticker, the column the API's symbols filter resolves against.
How often is gov_contract_tickers updated?
Obscura refreshes gov_contract_tickers 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.