Method

How SignalsAPI measures hiring demand — the sample, the deduplication rule, the known biases, and the metric definitions we have frozen in advance.

Version 1.12.0 · Last generated September 14, 2026

The sample

We track 4,788,072 job postings drawn from 55 distinct sources. Both of those figures describe what we ingest: postings admitted to the corpus, counted one row per posting as crawled, across the whole history we hold rather than a rolling window, and inclusive of postings sourced from LinkedIn. They state how wide the crawl reaches. They are deliberately not counted on the surface the market pages on this site read — the deduplicated, rolling 30-day view described under Deduplication and Vintage below, which is narrower in both respects.

What we measure is the volume of online job postings we observe, deduplicated to one row per company, job title and country.

What this does not measure

Known biases

Deduplication

Repeat and re-posted advertisements collapse to a single row per (company, job title, country). Where several postings share that key, we keep the most complete one — the row that resolves to a named company with an industry, headcount and location — and break remaining ties by the most recent posting date. Note the key is country, not city: two postings for the same role in two cities of one country count once, and the same role in two countries counts twice.

Partition key

lower(COALESCE(cp.name, s.company_name, s.url)), lower(s.title), s.country

Winner within each partition

completeness DESC (company name, industry, headcount, location present), posted_at DESC, id DESC

Vintage and revision policy

The corpus surface these pages read retains a rolling 30-day window on posting date. That window bounds what the market pages count, not what the corpus holds. The two breadth figures under The sample above are counted before it is applied, on the ingest population described there. Any metric requiring a longer observation span than that is listed below as pre-registered and is not published until the retention exists to support it.

Pre-registered metric definitions

These definitions are frozen and dated before any figure is computed under them, so a threshold can never be tuned after seeing a result. A metric marked pre-registered has no published figure — the reason is stated with it.

Ghost Job

pre-registered

A posting that remains open, or is re-listed under the same deduplication key, for at least 90 days without disappearing from its source.

Observation window required: 90 days

Not yet computable. The corpus render surface retains a rolling 30-day window, so a 90-day posting lifetime cannot be observed from it at all. Requires a retention surface longer than the metric's own window.

Backfill Velocity

pre-registered

The median number of days a requisition stays live, from the first time we observe it to the point it disappears from its source.

Observation window required: unbounded

Not yet computable. Requires per-requisition lifecycle tracking — a first-observed timestamp and a disappearance event — neither of which the 30-day render surface carries. Postings living longer than the window would be silently excluded, biasing the median downward by exactly the amount the metric is trying to measure.

Cross-Source Lead Time

pre-registered

For postings we observe on two or more sources, the median gap in hours between the first time the earliest source shows it to us and the first time the latest source does.

Observation window required: 30 days

Not yet computable. Two independent defects, either one disqualifying. Coverage: most of the corpus arrives through boards and aggregators rather than directly from an employer's applicant-tracking system, so for most postings there is no earlier observation to be ahead of, and a median computed over the minority that do would read as a claim about the whole corpus. Clock: the only timestamp available on both sides is when we observed a posting, not when its source published it, so the gap moves when we change crawl cadence rather than when the market does. The gauge runs continuously and is withheld until both are cleared.

Hiring-Demand Index

pre-registered

A monthly index of advertised hiring demand. Each edition's observation is the count of deduplicated postings — one row per company, job title and country, staffing agencies excluded — posted in the 28 days ending on that edition's publication slot. The index expresses that observation as a percentage of the base edition's observation, which is fixed at 100.0. The base edition is the first edition published under this definition.

Observation window required: 28 days

Not yet computable. Two reasons, and the first is arithmetic. Base: an index needs a base observation and at least one later one before it is a measurement rather than the definition of 100, and the series begins with the first edition published under this definition — the render surface retains a rolling 30-day window, so no earlier month is observable and none is back-cast. Review: the two named reviewers this page's publication policy requires have not signed off on a figure under this definition. The observations the index will be built from are published as they are made, on the study's own page and in its downloads; only the named index figure waits.

Hiring-Demand Index Accuracy vs Official Vacancy Statistics

pre-registered

For each reference month in which both series have a print, the Hiring-Demand Index's month-over-month percentage change minus the official series' month-over-month percentage change for that month, in percentage points, together with the share of those months in which the two moved in the same direction. An edition's reference month is the calendar month holding the majority of the 28 days its observation was counted over. The comparison is made against the official series' first published print for the month, never a later revision. Movement is compared, never level: this index counts advertised vacancies in a sample of public postings and does not estimate the vacancy stock an official survey measures.

Observation window required: unbounded

Not yet computable. Three inputs, none of them the definition, and the first cannot be hurried. Series length: the comparison needs 12 reference months with a print on both sides, and the index side began accruing with the first edition published under the index definition above — the render surface retains a rolling 30-day window, so no earlier month is observable and none is back-cast. Scope: the index counts postings across every market the corpus covers, while each official series covers one country, so the graded side is never the global index — it is a geography-matched sub-series recorded on the same slot, window and deduplication rule, differing from the global observation in the country filter alone. One such series is recorded per benchmark, and each accrues from its own first print exactly as the global index does. Official prints: nothing on this site reads an official series, so no month has an official number beside it. The accrual toward the first comparison is published at /labs/scorecard as it happens, including the months we have not reached.

Hiring-Demand Index Lead Over Official Vacancy Statistics

pre-registered

The whole-month shift — searched over 0 to 3 months — at which the Hiring-Demand Index's month-over-month direction agrees most often with the official series', reported together with the agreement at every shift tested so a shift that wins by one month is visible as winning by one month.

Observation window required: unbounded

Not yet computable. Everything the accuracy metric above is blocked on, and one thing more: a shift of k months consumes k of the paired months, so the longest shift tested needs that many reference months beyond the minimum. Publication timing is not this figure and will not be reported as it: the index prints a reference month before the official series does, which is a fact about two release calendars rather than a measurement of whether the index moves first, and stating the one as the other is the easiest indefensible claim on this site to make.

Dated measurements

Some figures on this site are readings rather than metrics: one measurement of a corpus that keeps moving, taken on a stated day. Nothing recomputes them, so each is published here with the population it describes, how it was derived, when it was taken and when it expires — 90 days later. Past that date our build fails until the figure is re-measured or the claim that quotes it is withdrawn.

The detection-latency readings below are published in full, with their derivations and their cohorts, at https://jobs.signalsapi.com/detection-latency.

2.1 hours

Population: postings read directly from an employer's applicant-tracking system, over the 14-day ingest window the whole latency cut was taken from.

Derivation: Median of `created_at - posted_at` over the ATS-direct cohort of a 14-day ingest window (n=2,441,587 across all cohorts). p95 on the same cohort is 5.7 days. 7.94% of corpus rows carry `posted_at` stamped equal to `created_at` at ingest (signalsapi-4450), which reads as zero latency; the cut is not filtered for them, so this is a floor rather than a point estimate.

Computed by: The 2026-08-08 measurement pack (`docs/gtm-cofounder/founder-brief.md`, §Measured facts, finding 2), cut directly against the corpus database upstream. This repo holds no read path that can reproduce it.

Expires 2026-11-06.

9 hours

Population: every non-synthetic posting in the same 14-day ingest window.

Derivation: Median of `created_at - posted_at` over the whole window (n=2,441,587); 9.0 hours unrounded. The class of rows with a trustworthy timestamp is 92.3% `li_jobs`, so this figure is substantially a statement about one source. 7.94% of corpus rows carry `posted_at` stamped equal to `created_at` at ingest (signalsapi-4450), which reads as zero latency; the cut is not filtered for them, so this is a floor rather than a point estimate.

Computed by: The 2026-08-08 measurement pack (`docs/gtm-cofounder/founder-brief.md`, §Measured facts, finding 2), cut directly against the corpus database upstream. This repo holds no read path that can reproduce it.

Expires 2026-11-06.

48 hours

Population: every non-synthetic posting in the same 14-day ingest window.

Derivation: 95th percentile of `created_at - posted_at` over the same population as the corpus-wide median above; 48.0 hours unrounded. 7.94% of corpus rows carry `posted_at` stamped equal to `created_at` at ingest (signalsapi-4450), which reads as zero latency; the cut is not filtered for them, so this is a floor rather than a point estimate.

Computed by: The 2026-08-08 measurement pack (`docs/gtm-cofounder/founder-brief.md`, §Measured facts, finding 2), cut directly against the corpus database upstream. This repo holds no read path that can reproduce it.

Expires 2026-11-06.

Lever detection latency (p50)

measured 2026-08-08

12 min

Population: postings whose source is Lever, in the same 14-day ingest window.

Derivation: Median of `created_at - posted_at` restricted to the Lever source; 12.1 minutes unrounded. 7.94% of corpus rows carry `posted_at` stamped equal to `created_at` at ingest (signalsapi-4450), which reads as zero latency; the cut is not filtered for them, so this is a floor rather than a point estimate.

Computed by: The 2026-08-08 measurement pack (`docs/gtm-cofounder/founder-brief.md`, §Measured facts, finding 2), cut directly against the corpus database upstream. This repo holds no read path that can reproduce it.

Expires 2026-11-06.

1.7 h

Population: postings whose source is Greenhouse, in the same 14-day ingest window.

Derivation: Median of `created_at - posted_at` restricted to the Greenhouse source. The unrounded figure is 99.3 minutes; the published form is its rounding to hours. 7.94% of corpus rows carry `posted_at` stamped equal to `created_at` at ingest (signalsapi-4450), which reads as zero latency; the cut is not filtered for them, so this is a floor rather than a point estimate.

Computed by: The 2026-08-08 measurement pack (`docs/gtm-cofounder/founder-brief.md`, §Measured facts, finding 2), cut directly against the corpus database upstream. This repo holds no read path that can reproduce it.

Expires 2026-11-06.

Workday detection latency (p50)

measured 2026-08-08

3.07 days

Population: postings whose source is Workday, in the same 14-day ingest window.

Derivation: Median of `created_at - posted_at` restricted to the Workday source, with 0.05% of that cohort inside an hour. Registered although no page quotes it: it is two orders of magnitude off the two vendors that are quoted, so it is what makes a pooled median under a sentence naming only the fast vendors a mixing error rather than a simplification. 7.94% of corpus rows carry `posted_at` stamped equal to `created_at` at ingest (signalsapi-4450), which reads as zero latency; the cut is not filtered for them, so this is a floor rather than a point estimate.

Computed by: The 2026-08-08 measurement pack (`docs/gtm-cofounder/founder-brief.md`, §Measured facts, finding 2), cut directly against the corpus database upstream. This repo holds no read path that can reproduce it.

Expires 2026-11-06.

ATS-native share of live reqs

measured 2026-08-08

6.29%

Population: live non-synthetic requisitions in the corpus on the measurement date.

Derivation: 44,125 of 700,999 live non-synthetic reqs name an applicant-tracking system as their source; the other 93.7% carry a job-board or aggregator URL. This is the figure behind every statement about where rows come from, and the reason no page may promise a source-ATS apply link.

Computed by: The 2026-08-08 measurement pack (`docs/gtm-cofounder/founder-brief.md`, §Measured facts, finding 1), cut directly against the corpus database upstream. This repo holds no read path that can reproduce it.

Expires 2026-11-06.

16.7%

Population: a stratified sample of 500 posting URLs the corpus still carries in its 14-day frame, 250 per stratum, drawn on a deterministic seed against the corpus rebuilt on 2026-08-18 — a different population from the 2026-08-08 reading this supersedes, which was taken over a 31-day frame that no longer exists.

Derivation: Re-fetch of each sampled URL, weighted back to corpus volume: 18.1% of 232 decidable ATS-direct URLs and 5.8% of 243 decidable aggregator URLs were dead or expired, giving a volume-weighted 16.7% (95% CI 12.3-21.2%) over a 14-day frame. This is not a like-for-like refresh of the 49.8% (95% CI 37.7-61.8%) read on 2026-08-08 and must not be published as an improvement: the corpus was rebuilt, its oldest record is 15 days old, so the 31-day frame the earlier figure was taken on returns nothing, and the rate is strongly age-dependent — signalsapi-4458 measured ATS-direct at 4.2%, 14.2%, 31.5% and 45.4% at 3, 7, 14 and 31 days. Most of the fall is the shorter frame. Two things the earlier entry said no longer hold. The strata are no longer indistinguishable — their confidence intervals are disjoint at both 7 and 14 days (14-day ATS-direct 13.7-23.6% against aggregator 3.5-9.4%) — so the earlier reading's conclusion that scoping a liveness claim to ATS-direct sources buys nothing is withdrawn, and the sign is the opposite of what it implied: ATS-direct is the worse stratum, and the aggregator stratum is the one a scoped claim would favour. And the ATS-direct stratum had to be framed as `lifecycle_status IS NULL` rather than active, because the lifecycle re-check has never run against that cohort at all (signalsapi-5032). Supersedes the 37.5% (n=48) figure the front door was never permitted to publish. This is the measured size of the gap behind the PRE_REGISTERED Ghost Job metric above — it is not a figure published under that definition, which stays blocked on a retention surface longer than its own 90-day window.

Computed by: signalsapi-5031, a re-run of `signals/scripts/measure_ghost_rate.py` on seed 5031 drawn 2026-09-02, against the plane. It replaces the 2026-08-08 sweep of signalsapi-4453 (closed), whose design cannot be re-run on today's corpus. This repo holds no read path that can reproduce it.

Expires 2026-12-01.

Pre-registered term lists

Some studies count postings by matching their titles against a fixed list of terms. Those lists are published here in full and dated, so the window they define cannot be widened or narrowed after a result is seen without that change appearing in the changelog below.

Terms are matched against a posting's job title, case-insensitively and on a word boundary — so “llm” matches “LLM Engineer” and not “fulfillment”. They are not matched against the description of the posting: the corpus surface these pages are built from carries a posting's title, company, location and salary but not its body text, so a posting whose body mentions a term under an unrelated title is not counted. Every list below therefore understates its term's true incidence, in the same direction and for the same reason.

AI & machine learning

frozen 2026-07-22
  • ai engineer
  • machine learning
  • ml engineer
  • deep learning
  • llm

Titles that name the model-building work itself. Deliberately excludes “ai” alone, which matches unrelated titles on a word boundary, and the vendor and framework names that trend and fade faster than a monthly study's cadence can honestly track.

Data engineering

frozen 2026-07-22
  • data engineer
  • analytics engineer
  • etl

Titles for building and moving the data the models are trained and served on — the pipeline half of the same team, kept separate so growth in one is not read as growth in the other.

Data science

frozen 2026-07-22
  • data scientist
  • data science

Titles for analysis and experimentation rather than production systems. Narrow on purpose: broadening it toward “analyst” would absorb business reporting roles and inflate the cut.

Platform & reliability

frozen 2026-07-22
  • devops
  • site reliability
  • platform engineer
  • sre

Titles for the runtime the above is deployed onto. Included as the comparison set: it is the specialism whose demand would have to fall if model work were displacing infrastructure work rather than adding to it.

Security engineering

frozen 2026-07-22
  • security engineer
  • application security
  • appsec

Titles for securing the systems above. A second comparison set, and the one least coupled to model adoption — a control against reading a market-wide hiring swing as a specialism-specific one.

Pre-registered industry groups

Some studies rank demand across sectors. The sectors are published here in full and dated, so a taxonomy cannot be redrawn around a result after the result is seen without that change appearing in the changelog below.

Industry labelling covers 67.22% of the deduplicated postings these pages render (measured 2026-07-22). That coverage is not evenly distributed: it is 88.81% on our largest single source and 31.55% across every other source combined, and two national corpora carry almost no industry labels at all. So counting postings per industry and ranking the industries would largely rank which sectors our best-labelled source happens to cover. Any figure we publish by industry is therefore a rate measured inside a sector — the same labelled population in the numerator and the denominator — never a share of the whole corpus, and it excludes every posting whose employer carries no industry label.

Industry groups are matched against the industry label the source itself publishes for the employer, case-insensitively and as a substring — so “software” matches “Software Development”. Substring matching is looser than the word-boundary rule used for job titles, which is why every term below is a phrase specific enough that no unrelated label contains it. A label may match more than one group; each group is measured against its own postings, so an employer counted in two groups is counted correctly in both rather than twice in one.

Software & IT

frozen 2026-07-22
  • software
  • information technology
  • it consulting
  • computer hardware
  • computer networking

The sector that builds software as its product. Expected to lead any engineering-demand ranking, and included precisely so that expectation is measured against the others rather than assumed.

Financial services

frozen 2026-07-22
  • financial services
  • banking
  • insurance
  • capital markets
  • investment management

Regulated, data-heavy, and an early adopter of model-driven work outside the technology sector — the clearest test of whether AI hiring has spread beyond employers whose product is software.

Healthcare & life sciences

frozen 2026-07-22
  • hospital
  • health care
  • healthcare
  • pharmaceutical
  • biotechnology
  • medical device

Research-intensive and slow-moving on hiring, so a rate that rises here is harder to explain as a labelling artefact than one that rises in software.

Manufacturing & industrial

frozen 2026-07-22
  • manufacturing
  • automotive
  • machinery
  • industrial automation

The largest employer group in several of the national corpora we read, and the one whose postings least often reach an English-language ATS — a control against reading source coverage as sector demand.

Retail & consumer

frozen 2026-07-22
  • retail
  • wholesale
  • consumer goods
  • food and beverage

High posting volume, low engineering density. Included as the low end of the expected range: a ranking with no low end is a ranking whose scale a reader cannot judge.

Telecom, media & entertainment

frozen 2026-07-22
  • telecommunications
  • broadcast media
  • publishing
  • entertainment
  • advertising services

Recommendation and content-generation work sits here, so it is where applied model work would appear first outside the technology sector proper.

Government, education & research

frozen 2026-07-22
  • government
  • education
  • research services
  • defense

Public-sector and academic postings follow a hiring calendar rather than a market, so this group is expected to move differently from the rest and is kept separate rather than folded into professional services.

Professional & business services

frozen 2026-07-22
  • management consulting
  • legal services
  • accounting
  • engineering services
  • human resources

Firms that sell expertise rather than a product. Their postings are often for client projects, which is stated here because it is the group whose demand is least attributable to the employer's own operations.

Changelog

See also Data ethics — what we hold, and what we will not publish.