Where the postings come from
Postings are pulled directly from each company's own public applicant tracking system or career-site API (Greenhouse, Ashby, Lever, Workday, iCIMS, SmartRecruiters, and others), not scraped from job boards and not bought from a data vendor. That matters for two reasons: the text is the employer's own, and a posting disappears from our corpus when the employer takes it down rather than when an aggregator gets around to noticing.
The corpus refreshes several times a day and holds roughly 270,000 active postings, of which the US subset is what our research reports on. Individual posts quote the exact active count on the day they were measured, because that number moves with the crawl cycle.
Deduplication
The same job is frequently posted many times: one description replicated across hundreds of store or branch locations. We collapse these by an exact match on the job-description text (an MD5 hash of the raw body), and the pass runs server-side after every scan.
Exact matching is the conservative choice and it undercounts. Two postings for the same role worded differently are not treated as duplicates, so the true rate of phantom volume in any job board, ours included, is higher than the figure we report. We would rather understate it than merge two genuinely different jobs.
How requirements are extracted
Each posting gets one language-model pass that turns its description into a typed requirement graph: each requirement classified as a technical skill, tool, certification, license, degree, domain knowledge, or years of experience, and marked required or preferred. When a post says a posting "asks for 13 things," that is the count of extracted requirements typed as hard requirements.
This is an approximation, not a hand-audited count. The extraction runs once per posting and is not reviewed by a human. Coverage is high (99.7% on the S&P 100 cut), but the per-posting count should be read as an estimate. We do not re-extract a corpus with a different model mid-analysis, because requirement counts are not comparable across extraction models.
How salary is read
- The midpoint of the posted US range, base pay only.
- Sanity bounds of $30,000 to $900,000; anything outside is dropped rather than winsorized.
- Hourly rates are annualized at 2,080 hours.
- No equity, bonus, or benefits. Companies that pay heavily in stock therefore read low, and we do not correct for it.
- A posting counts as disclosing pay if it carries a figure either as structured data or stated in the description text.
Outside data we use
Where a post compares advertised pay against what employers report to the government, the comparison uses the public Department of Labor H-1B LCA disclosure file (roughly one million rows for FY2026), matched to employers by normalized name. Those filings are historical while postings are current, so part of any gap between the two is timing and seniority mix rather than a discrepancy. Posts that use borrowed survey figures name the survey, its sample, and its publication date inline.
What the corpus does not cover
- Companies on closed career portals (Apple, Google, Meta, and Microsoft among them) publish through systems our pipeline does not read. They are excluded from counts rather than estimated.
- This is each company's public careers pipeline, not every internal requisition. Roles filled without a public posting are invisible to us, as they are to every job seeker.
- Role and industry classification is done by title pattern matching, which is a rough cut: it misses some roles and catches some adjacent ones. Posts say so where a cut depends on it.
- Non-US postings are excluded from US figures by a location classifier, which is not perfect at the margins.
Corrections
If a figure here is wrong we would rather know. Posts carry a published and, where it applies, an updated date, and a material correction gets a note in the post itself rather than a silent edit. Tell us what looks off.
Citing this research
Journalists and researchers are welcome to quote any figure on this blog. Please link to the specific post rather than the blog index, so readers can reach the methodology note attached to that number. A cut we have not published (by role family, industry, or metro) is usually a query rather than a project; ask.
Resunova. "[Post title]." Resunova Blog, [date]. https://www.resunova.io/blog/[slug]/
Following the research
New findings go out by RSS and to the list below, and every post is indexed on the blog.