This page sets out what to check before buying a job postings dataset: six tests to run on a sample of postings, each with the figure to compute and the arithmetic worked on an illustrative sample. After it you can put a number on a vendor's duplicates, stale listings, dates, filled fields, company matching and label accuracy, and compare vendors on the same six figures. The questions that apply to any company data, from sourcing to the licence, are in ten questions for a company data vendor. The six below are particular to postings.
Six things to check before buying a job postings dataset
Before buying a job postings dataset, run six checks on a sample for the companies you track: how many records one role produces, whether postings marked open are still open, what each date means, how often each field is filled, how each posting is tied to a company, and how often the labels are right.
A posting is an advertisement: the same role can be advertised in several places, stay advertised after it is filled, carry more than one date and name its employer only as text. Each test turns one of those into a rate.
Ask each vendor for the same sample: every posting it held, open and closed, on the companies you track over a fixed period such as eight weeks, with the address of the original posting on every record. Four of the six tests open that address.
Job board data and career site direct postings: accuracy, duplicate and stale listings
Job board data is collected from sites that list many employers' roles, so one role can arrive as several listings and can stay listed after the employer has closed it. Career site data is read from each employer's own careers page, where the employer publishes and removes each role. Either way, measure duplicate and stale listings on a sample.
Eurostat's notes on its experimental statistics on online job advertisements say that the same advertisement may be counted more than once when it was posted on several web portals. The UK Office for National Statistics (ONS), in the user guide to its labour demand statistics revised on 5 November 2024, reports that most adverts in the online advert data it takes from one supplier have duplicates: across the UK from January 2017 to July 2024, each new unique advert came on average with two others identified as duplicates. It notes that calling two adverts duplicates assumes something about the employer, since one advert shared to several locations can look like several posts advertised across the country.
An employer can repeat itself too, with one posting for each location of a role, so run both tests on any source, the employer's own careers page included.
Test 1: how many records one role produces
Group the sample by company, normalised title and location. Records minus groups is the surplus: records that repeat a role already in the file. Then open a random 30 of the repeated groups at their original addresses and decide each by hand: one role listed more than once, or separate openings the employer chose to publish. The first share, applied to the surplus, estimates the copies.
On Job Postings, the Fokals dataset that holds one record for each posting, the grouping by company, title and country is one query.
with role_groups as (
select
company_id,
lower(trim(title)) as title_key,
country,
count(*) as records
from job_postings
group by company_id, lower(trim(title)), country
)
select
sum(records) as all_records,
count(*) as groups_found,
sum(records) - count(*) as surplus_records
from role_groups;Test 2: whether open postings are still open
Draw 100 records marked open, open each original address within a day of the sample date and count the roles that are gone: the page removed, or a notice that the role is closed. That share is the stale rate. Run the reverse on 100 records marked closed.
Then ask how a close is decided. Google's documentation for job posting markup gives a site three ways to remove a posting that is no longer available: an expiry date in the markup that has passed, a page that returns a 404 or 410 status code, or markup taken off the page. It says to leave the expiry date out when a posting never expires or its end is unknown, so the date is not on every posting. A close is then observed or set by a rule. The ONS guide records one rule: its supplier closes adverts that have been live for more than a year, or for more than six months when most of their duplicates have closed. Posting durations computed from a close set by rule measure the rule.
Job postings data quality by field: salary, location, dates and a benchmark dataset
Judge job postings data quality field by field, as the share of records where each field is filled and valid. Salary appears only where the employer states it, location needs a country on every record, and every date needs a defined meaning. For a benchmark dataset, use the employer's own page for records and official vacancy statistics for trends.
Test 3: what each date means
A posting record can hold four dates: the date the employer gives, the day the vendor first saw the posting, the day it last saw it and the day it closed. Google's documentation defines the date posted as the original date the employer posted the job, and lists it among the required properties of job markup. The other three are the vendor's observations, and they say when you could have known.
Compute the share of records that carry each date. Then look for the baseline: postings already published when the vendor first read a company, whose first-seen date is the day of that read and not the day the role opened. Unmarked, they count as openings. Why we write each table once explains the baseline rule.
Test 4: how often each field is filled
For each field, divide the records where it is filled and valid by all records, country by country. A pay field is valid when its minimum is no greater than its maximum and it has a currency and a period.
Pay needs the split by country because the rules on stating it differ. Google's documentation lists base salary as a recommended property, where the title and the job location are required. New York State's pay transparency law requires businesses with four or more employees to list compensation ranges for designated job opportunities. The European Commission's summary of the EU pay transparency rules of 5 June 2026 says employers will have to tell job seekers the starting salary or pay range in the vacancy notice or ahead of the interview, so a range may reach the applicant outside the posting. One overall fill rate describes neither rule.
Location is not always stated: the ONS guide of November 2024 puts adverts it could not assign to a local authority, some because they state no location, at 4.7% of the UK adverts left after its data cleaning. On Job Postings the fill rates by country are one query.
select
country,
count(*) as postings,
round(100.0 * count(coalesce(salary_min, salary_max)) / count(*), 1) as pay_stated_pct,
round(100.0 * count(coalesce(salary_usd_annual_min, salary_usd_annual_max)) / count(*), 1) as pay_annual_usd_pct,
round(100.0 * count(nullif(work_mode, '')) / count(*), 1) as work_mode_pct,
round(100.0 * count(nullif(employment_type, '')) / count(*), 1) as employment_type_pct
from job_postings
group by country
order by postings desc;The benchmark for a record and for a total
A single record has an exact benchmark: the employer's own page. A total has no exact one in official vacancy statistics, because they count something else. The US Bureau of Labor Statistics defines a job opening in its JOLTS survey as a position open on the last business day of the month, where a specific position exists with work available, the job could start within 30 days and the establishment is actively recruiting from outside. The ONS notes that an online advert may be a speculative search for talent or may hold more than one position. Its deduplicated snapshot of one supplier's UK online adverts for August 2024 stood 66% above the vacancies its own survey counted for the same period, while the broad trend of the two was comparable. Benchmark postings against official series on direction and timing, not on level.
The company key and the labels
The last two tests cover what a vendor adds to a posting: its company and its labels.
Test 5: how a posting is tied to a company
A listing names its employer as text, and the name can be a trading name, a subsidiary or a recruiter. Three figures test how the dataset turns that text into a key. Match your list to the sample and compute the share of your companies found, which is data coverage on your list. Count the keys each matched company appears under: more than one splits its postings. Open 50 original postings to confirm that the employer on the page is the company on the record. The identifiers that make company data joinable sets out which key serves which join.
Test 6: how often the labels are right
A job function and a seniority level are added by the vendor, from the title and the text of the posting. The schema.org JobPosting type has a property for an occupational category, preferably a term from a published taxonomy, and names ISCO-08 as an example. A vendor may map to such a taxonomy or keep a list of its own, under a label version that should be on every row.
Draw 100 labelled postings at random, read each original posting and mark every label correct, wrong or unsure. Precision is correct divided by correct plus wrong. Put an interval on it: the NIST handbook's section on confidence intervals for a proportion sets out the Wilson method. Record also the share of postings that carry a label at all.
A worked example: six tests on an illustrative sample
This example is illustrative: the vendor, the sample and every figure are invented, and so is the company Acme Robotics.
Assumptions:
- You track 40 companies, Acme Robotics among them. A vendor sends every posting it held on them over eight weeks: 2,000 records, 1,500 marked open on the last day and 500 closed.
- Test 1: the records fall into 1,760 groups of company, title and location, each of the 240 repeated groups holds two records, and 18 of 30 repeated groups opened by hand are one role listed twice. Copies are spread evenly over open and closed records.
- Test 2: of 100 open records checked, 9 are gone from the employer's page. Of 100 closed records, 4 are still live.
- Test 3: 1,120 records were first seen inside the eight weeks. 320 of them were already published when the vendor first read their company, and none is marked.
- Test 4: pay is stated on 400 of the 800 US records and on 120 of the 1,200 others.
- Test 5: 36 of the 40 companies are found. Acme Robotics appears under three keys, with 41, 12 and 7 records.
- Test 6: of 100 job function labels graded by hand, 88 are correct, 8 wrong and 4 unsure.
| Test | Working | Result |
|---|---|---|
| 1. Duplicates | 2,000 − 1,760 = 240 surplus records. Copies: 18 ÷ 30 = 60%, and 240 × 0.60 = 144 | 144 ÷ 2,000 = 7.2% of records are copies |
| 2. Stale listings | 1,500 × 9% = 135 gone. 500 × 4% = 20 live. 1,500 − 135 + 20 = 1,385 open | Open postings overstated by 1,500 − 1,385 = 115, and 115 ÷ 1,385 = 8.3% |
| 3. Dates | 1,120 − 320 = 800 openings observed | New postings overstated by 320 ÷ 800 = 40% |
| 4. Fields | (400 + 120) ÷ 2,000 = 26.0% overall. US: 400 ÷ 800 = 50.0%. Elsewhere: 120 ÷ 1,200 = 10.0% | One rate of 26.0% hides 50.0% and 10.0% |
| 5. Company key | 36 ÷ 40 = 90% of your list. Acme Robotics: 41 + 12 + 7 = 60 records | One key shows 41 of the company's 60 postings, 68.3% |
| 6. Labels | 88 ÷ (88 + 8) = 91.7% on 96 decided labels. Wilson 95% interval: 84.4% to 95.7% | A stated accuracy of 99% lies outside the interval |
Two results combine. Of the 1,500 open postings in the file, correcting for stale and wrongly closed records leaves 1,385, and removing the 7.2% that are copies leaves 1,385 × 0.928 = 1,285 open roles, 14.3% fewer than the file shows.
A data quality checklist for evaluating a job listings dataset vendor
A checklist for evaluating the data quality of a job listings dataset vendor has six lines, one for each test: the figure to record from the sample, and the document or answer to ask the vendor for. Fill it in for every vendor on the same list of companies, and compare the figures side by side.
| Check | Figure to record | Ask the vendor |
|---|---|---|
| 1. Duplicates | Surplus share, and copies among repeats | The rule that makes two listings one role |
| 2. Stale listings | Stale rate of open records, live rate of closed ones | Whether a close is observed, set by rule or read from an expiry date |
| 3. Dates | Share of records with each date, unmarked baseline records | The written meaning of each date and the mark on a baseline posting |
| 4. Fields | Filled and valid share, by field and country | Which fields are as published and which are derived |
| 5. Company key | Share of your list found, keys per company | The stable key, the identifiers beside it and how a brand reaches its parent |
| 6. Labels | Precision with its interval, share of records labelled | The taxonomy, the label version on each row and how accuracy is measured |
We found no official standard that sets a pass mark for any of these figures. Set your own from the decision the data feeds, and hold every vendor to the same marks.
How Fokals Job Postings answers the six checks
Job Postings is the dataset of the Fokals hiring product that holds every role a company publishes. Each line below can be read against the public methodology and data dictionary.
| Check | Job Postings |
|---|---|
| 1. Duplicates | Sourced first-party, from each employer's own careers page. One record for each posting, with a stable posting ID and the address of the public posting |
| 2. Stale listings | Refreshed daily. Every posting carries its last-seen date, and a close is confirmed before it is written |
| 3. Dates | The employer's posting date, with first-seen, last-seen and close dates. A posting already published at the first observation carries a baseline flag and is never counted as new |
| 4. Fields | Title, department, team, locations, work mode and employment type. Pay as stated and on one annual US-dollar scale. Experience, degree, visa sponsorship, languages and tools named |
| 5. Company key | One stable company ID on every record, with ticker, MIC, ISIN, LEI and share-class FIGI for a listed company or a brand it owns |
| 6. Labels | 26 job functions, 9 seniority levels and ten role flags, each defined in the data dictionary, with a named version carried on the record |
Sample data for the companies you name is sent on request with the data dictionary and the methodology, so the six tests run on your list.
Frequently asked questions
What should I check before buying a job postings dataset?
Check six things on a sample of postings for the companies you track: the share of records that repeat a role, the share of open postings that are gone from the employer's page, what each date means and whether postings already published at the vendor's first read are marked, how often each field is filled in each country, how postings are tied to a company key, and how often the labels are right when graded by hand. Record a figure for each and compare vendors on the same list of companies.
How many duplicate postings does a job postings dataset contain?
It depends on where the postings were collected. The UK Office for National Statistics reports that in the online advert data it takes from one supplier for its labour demand statistics, across the UK from January 2017 to July 2024, each new unique advert came on average with two others identified as duplicates. We found no official figure for postings read from employers' own careers pages, where the repeats are the ones the employer publishes, such as one posting for each location. Measure the rate on a sample: group by company, title and location, then judge a random set of the repeats by hand.
How do you check whether a job posting is still open?
Open the original posting. Draw a random 100 records the dataset marks as open, open each address within a day of the sample date and count the roles that are gone, which gives the stale rate. Then ask how the vendor decides a close: by observing that the role has left the employer's page, by a rule such as a maximum age, or from an expiry date in the source. Google's documentation tells sites to leave the expiry date out of job markup when it is unknown, so the date is not always there to read.
Why do job posting counts differ from official job vacancy statistics?
They count different things. The US Bureau of Labor Statistics counts a job opening in its JOLTS survey when a specific position exists with work available, could start within 30 days and is being actively recruited for from outside the establishment, as of the last business day of the month. A posting is an advertisement: the UK Office for National Statistics notes that one online advert may hold several positions or be a speculative search for talent. Compare postings with official series on direction and timing, not on level.
How many labels do I need to grade to test label accuracy?
A hundred graded labels give a first reading with a wide margin. With 90 correct out of 100 decided labels, the Wilson 95% interval runs from 82.6% to 94.5%, about twelve points. With 360 correct out of 400 it runs from 86.7% to 92.6%, about six points. Draw the postings at random, grade each against the original posting and leave unsure verdicts out of the ratio. Grade job function and seniority separately, because each label has its own error rate.
The queries and code on this page are examples to adapt. Test them in your own environment before you rely on them.
What this page says about the products it names was checked against their public documentation on 7 October 2026. Product and company names are trademarks of their owners. Fokals is not affiliated with them or endorsed by them.