Obscura

Employee Counts

Employee headcount as stated in the text of 10-K annual reports.

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

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

What one row means

A company headcount reading extracted from the Item 1 prose of a single annual report (10-K / 10-K/A / 20-F / 20-F/A / 40-F) — the "we had approximately N employees" disclosure. XBRL tags this only rarely, so the prose is the real source (as vendors do it). One row = one annual filing's headcount for one company, forming a per-company headcount time series (expansion / layoff signal). Keyless beyond (cik, available_date).

One row per (cik, available_date): one row per company (CIK) per annual-report filing date..

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 employee_counts: published: available_date = the filing date (SEC date_filed) of the annual report, joined from filename -> edgar_filings.event_date; the day the disclosure became public.

Refresh cadence

Obscura refreshes employee_counts 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 employee_counts, with the meaning of every field. The same schema is served unauthenticated at https://api.obscura.trade/v1/catalog/employee_counts.

ColumnTypeDescription
cikbigint · not nullSEC Central Index Key of the filer; part of the composite primary key.
available_datedate · not nullFiling date (SEC date_filed) of the annual report the headcount was read from, via filename -> edgar_filings join; the day the disclosure became public. Part of the composite primary key.
form_typetextThe annual-report form the count came from (10-K, 10-K/A, 20-F, 20-F/A, 40-F); nullable, copied from the edgar_filings row.
period_of_reportdateFiscal-period-end / true "as of" date the headcount is measured, parsed from the SEC-HEADER `CONFORMED PERIOD OF REPORT` (e.g. `20250927` -> 2025-09-27; the prose reads "As of Sep 27, 2025, … employees"). Nullable. We key the row on `available_date` (the filing date) to avoid look-ahead, but this is the real effective date of the measurement.
employeesbigint · not nullThe extracted headcount (plausible range 50..=5,000,000) parsed from prose near an "employee(s)"/"employed" mention; not null. The core signal.
filenametextEDGAR filing path the count was extracted from (e.g. edgar/data/320193/0000320193-26-000123.txt); nullable; the join key back to edgar_filings and the source-document reference.
scraped_attimestamp with time zone · not nullInternal ingestion timestamp (defaults to now()); excluded from exports. Note: this table names it scraped_at rather than the standard synced_at.

Access employee_counts

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

Create a free account Browse all 95 datasets

Frequently asked questions

What is in the employee_counts dataset?

Employee headcount as stated in the text of 10-K annual reports. A company headcount reading extracted from the Item 1 prose of a single annual report (10-K / 10-K/A / 20-F / 20-F/A / 40-F) — the "we had approximately N employees" disclosure. XBRL tags this only rarely, so the prose is the real source (as vendors do it). One row = one annual filing's headcount for one company, forming a per-company headcount time series (expansion / layoff signal). Keyless beyond (cik, available_date).

How do I avoid look-ahead bias with employee_counts?

Filter on employee_counts.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — published: available_date = the filing date (SEC date_filed) of the annual report, joined from filename -> edgar_filings.event_date; the day the disclosure became public. A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.

In what formats can I get employee_counts?

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

Can I filter employee_counts by company or symbol?

Yes. employee_counts carries cik, the column the API's symbols filter resolves against.

How often is employee_counts updated?

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

Board InterlocksPairs of public companies that share a director, reconstructed from SEC insider filings: one row per (director, company … 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). 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.