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.
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.
| Column | Type | Description |
|---|---|---|
| cik | bigint · not null | SEC Central Index Key of the filer; part of the composite primary key. |
| available_date | date · not null | Filing 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_type | text | The 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_report | date | Fiscal-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. |
| employees | bigint · not null | The extracted headcount (plausible range 50..=5,000,000) parsed from prose near an "employee(s)"/"employed" mention; not null. The core signal. |
| filename | text | EDGAR 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_at | timestamp with time zone · not null | Internal 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.