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.
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.
| Column | Type | Description |
|---|---|---|
| onet_version | text · not null | O*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_code | text · not null | O*NET-SOC occupation code, e.g. "11-1011.00" — an O*NET-refined extension of the BLS SOC taxonomy. |
| title | text · not null | Official O*NET occupation title for this code in this release. |
| description | text | Free-text narrative description of the occupation's duties/scope. |
| available_date | date · not null | The 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.