egzakutacno/deunemployment-labour-market
DeUnemployment labour-market dataset Job-posting measures derived from our own crawl of employer career sites and applicant-tracking systems. One edition per month; the files are regenerated from the same full-corpus pass that produces the public report. Edition: September 2026 (as of 2026-09-24) License: CC BY 4.0 — use it commercially, credit us DOI: 10.5281/zenodo.22865284 (Zenodo; every edition is under the concept DOI 10.5281/zenodo.22865283) Cite as: DeUnemployment… See the full description on the dataset page: https://huggingface.co/datasets/egzakutacno/deunemployment-labour-market.
DeUnemployment labour-market dataset
Job-posting measures derived from our own crawl of employer career sites and applicant-tracking systems. One edition per month; the files are regenerated from the same full-corpus pass that produces the public report.
- Edition: September 2026 (as of 2026-09-24)
- License: CC BY 4.0 — use it commercially, credit us
- DOI: 10.5281/zenodo.22865284 (Zenodo; every edition is under the concept DOI 10.5281/zenodo.22865283)
- Cite as: DeUnemployment, "State of Jobs — September 2026", https://deunemployment.com/report
- Homepage: https://deunemployment.com/dataset
- Interactive version: https://deunemployment.com/report · https://deunemployment.com/data
- Update cadence: monthly figures, rebuilt by our daily pipeline
What is in here
How the data is collected
We crawl employer career sites and applicant-tracking systems directly (a posting is read where the employer serves it, not from an aggregator's copy). Each daily pass records, per posting: employer, title, location, the description body, the publication date the source itself reports, and the timestamps on which our crawler saw it served. The monthly edition freezes that crawl into a full-corpus pass: 6,564,432 postings measured, no sampling.
Two timestamps matter and they are different things:
publication_date— what the source claims. 92.83% of postings carry one.last_seen— when our crawler last got the posting served. This is our own measurement and the one that cannot be copied from a feed.
Variables
postings_by_role.csv — role (slug of the role family), postings, locations_tracked, top_location, top_location_postings.
postings_by_country.csv — country_code (ISO 3166-1 alpha-2), country, postings, pct_pay_stated, pct_remote, pct_listed_over_30d, pct_listed_over_60d, pct_listed_over_90d, median_listing_age_days. median_listing_age_days is computed for the largest markets only and is blank elsewhere — we do not interpolate.
postings_by_platform.csv — platform, postings, postings_with_publication_date, pct_with_publication_date, pct_published_within_1d, pct_pay_stated, pct_listed_over_30d, pct_listed_over_60d, pct_listed_over_90d, median_listing_age_days.
listing_age.csv — long format: measure, segment, value, unit, n, definition. n is the number of postings the measure was computed over.
corpus_health.csv — long format: section (corpus | audit | liveness), metric, value, unit, n, definition.
Known issues and limitations
- "Still listed" is a listing age, not a job opening. Any measure built on the stated publication date describes how long an ad has been up. Whether the role is still open is a different question, measured separately by probing the employer URL (see
corpus_health.csv,section = liveness). - Publication dates come from the source and are imperfect. 7.17% of postings state none; 0.03% state a date in the future; some state a date later than the day we first saw the posting served.
- Coverage is employer career sites and ATS platforms, not the whole labour market. Boards that hide postings behind a login or an app are not counted.
- Role families are a fixed taxonomy, so
postings_by_role.csvhas 158 rows and a largeothershare. It is not a free-text occupation classification. - Country assignment is parsed from the location string and the ad body. Remote postings may be assigned to no country; 82 countries have postings in this edition.
- Pay figures are extracted from ad text, so
pct_pay_statedmeasures what the ad discloses, not what the job pays. Currencies and periods vary and are not converted here. - Blocked probes are not dead links. A WAF returning 403/429 means unknown; it is reported separately from
gone. - This is aggregate data. The per-posting corpus is not redistributed; the tables are counts and rates. Custom cuts on request.
Methodology, verification and provenance
- Methodology: https://deunemployment.com/about-data
- Data health (coverage, date sanity, liveness): https://deunemployment.com/data-health
- The same figures rendered for humans: https://deunemployment.com/report
- Machine-readable headline report: https://deunemployment.com/report/data.json
Every file here is regenerated by scripts/build_dataset.py inside the daily build, from report.json, cross_tabs.json, data_health.json, seo_counts.json and source_date_availability.json — the tables cannot drift from the site.
Contact
Corrections, method questions and custom cuts: https://deunemployment.com/contact
