Obscura

O*NET Occupation Data

The O*NET database of occupations: the tasks, skills and requirements that define each job, by release version.

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

Category Corporate Columns 5 Refresh Daily Point-in-time available_date

What one row means

One occupation's canonical SOC title and narrative description as published in a single named O*NET database release (e.g. db_30_3) — the O*NET Content Model's "Occupation Data" table for that version, one row per occupation code per release.

One row per (onet_version, onetsoc_code).

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 onet_occupation_data: published: available_date = the date the O*NET Resource Center published that numbered release (a release goes public atomically, and no per-record event date exists). Resolved from O*NET's release index `db_releases.html` (which states a month per version) refined by `rss/whatsnew.xml` (day precision for recent releases), falling back to MONTH END when no announcement pins the day — conservative, so it never claims availability before the release existed. NOT the zip's `Last-Modified`: that header is a mutable server mtime O*NET re-touches (both the May-2026 and November-2024 releases showed 2026-07-23).

Refresh cadence

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

ColumnTypeDescription
onet_versiontext · not nullO*NET database release, e.g. "30.3" (from `db_30_3_text.zip`). Half of the composite key; the same occupation is stored once per release it appears in, so title/description drift across versions is preserved.
onetsoc_codetext · not nullO*NET-SOC occupation code, e.g. "11-1011.00" — an O*NET-refined extension of the BLS SOC taxonomy.
titletext · not nullOfficial O*NET occupation title for this code in this release.
descriptiontextFree-text narrative description of the occupation's duties/scope.
available_datedate · not nullThe date this O*NET version was published, identical for every row of a given onet_version, taken from O*NET's release index + announcement feed (month end when only the month is known). This is the sole date on the table — O*NET carries no per-occupation period/event date to distinguish from it, since a release becomes public atomically.

Access onet_occupation_data

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="onet_occupation_data",
    start="2024-01-01",
)

Create a free account Browse all 95 datasets

Frequently asked questions

What is in the onet_occupation_data dataset?

The O*NET database of occupations: the tasks, skills and requirements that define each job, by release version. One occupation's canonical SOC title and narrative description as published in a single named O*NET database release (e.g. db_30_3) — the O*NET Content Model's "Occupation Data" table for that version, one row per occupation code per release.

How do I avoid look-ahead bias with onet_occupation_data?

Filter on onet_occupation_data.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — published: available_date = the date the O*NET Resource Center published that numbered release (a release goes public atomically, and no per-record event date exists). Resolved from O*NET's release index `db_releases.html` (which states a month per version) refined by `rss/whatsnew.xml` (day precision for recent releases), falling back to MONTH END when no announcement pins the day — conservative, so it never claims availability before the release existed. NOT the zip's `Last-Modified`: that header is a mutable server mtime O*NET re-touches (both the May-2026 and November-2024 releases showed 2026-07-23). A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.

In what formats can I get onet_occupation_data?

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

How often is onet_occupation_data updated?

Obscura refreshes onet_occupation_data 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.

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). Employee CountsEmployee headcount as stated in the text of 10-K annual reports. 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.