Get a free key
Report · measured 2026-09-12

Postings on Hireology boards stay open 4x longer than on Teamtailor: median 155 vs 39 days

Posting age by applicant tracking system, measured across 1,069,340 rows that carry a publish date. Ten systems compared, with the denominator for each.

A job posting that has been open for five months is telling you something — maybe the role is hard to fill, maybe nobody closed the requisition. What surprised us is how much that number depends on which applicant tracking system the employer runs. Same labour market, same morning, ten systems, and the median age of an open posting ranges from 39 to 155 days.

Every row below comes from one API call per system, the whole table taken in a single pass between 06:48:17 and 06:48:22 UTC on 2026-09-12.

Posting age by system

Applicant tracking systemRows with a publish dateMedian days openOpen more than 60 daysPublished in the last 7 days
Teamtailor37,8903939.6%13.3%
Ashby62,2054740.5%8.1%
Breezy26,4375146.8%14.5%
Greenhouse209,1385447.1%7.7%
Workable170,3935949.4%9.3%
Lever76,7518656.5%7.3%
Recruitee43,2419961.1%6.8%
SmartRecruiters413,02010757.1%10.7%
Personio17,03013668.1%3.9%
Hireology13,12515571.2%5.1%

Across all ten: 1,069,340 rows with a date, median 68 days, 52.5% open longer than 60 days, 9.3% published in the last seven days.

Hireology is the newest source in the index — we started reading it on 2026-09-12 — and it arrived at the top of this table. Every one of its 13,125 rows carries a publish date, which is rarer than it sounds, and 71.2% of them have been open for more than two months.

What this is not

It is not a ghost-job detector. Age is age. A 155-day-old posting can be a genuinely hard search, a pipeline requisition, or a listing nobody cleaned up — the API reports the number, and the intent stays unknown. Notice also that the ranking is not “quality of ATS”: Personio’s user base skews to European mid-size employers, Hireology’s to North American dealerships and healthcare groups that keep evergreen openings, Teamtailor’s to Nordic companies that hire in bursts. What the table does tell you is that if you are building anything that treats posting age as a signal — a freshness filter, a lead score, a dashboard — the threshold cannot be one global number.

Workday is missing on purpose

Workday is the largest source in our index: 699,458 rows of 1,769,120. It is absent from the table because its boards publish the age of a posting as a phrase — “Posted 10 Days Ago” — rather than as a date, and a phrase cannot be compared or filtered. An absolute date does exist deeper in each posting, but it is not in the field the age filter reads, so we have a usable date for 110 of those rows as of 2026-09-12, 06:48 UTC. Including Workday would have produced a median computed on 0.02% of its rows and presented it as if it described all of them.

This is the honest shape of the data, and it is worth saying out loud: when a vendor quotes “posting age across 1.7M jobs”, ask what the denominator is. Ours is 1,069,340 rows, and Workday is not in it.

Reproduce it

One call per system. This is the Hireology row. A filter nobody has asked for lately is computed from cold, and that first call can come back 503 — or 429 if you are at the plan limit. Neither is a failure: wait what the answer asks for and repeat the call once.

import requests, time

URL = "https://hiringindex.p.rapidapi.com/jobs/insights"
HEAD = {
    "X-RapidAPI-Key": "YOUR_KEY",
    "X-RapidAPI-Host": "hiringindex.p.rapidapi.com",
    "Content-Type": "application/json",
}
FLT = {"source_platforms": ["hireology"]}

r = requests.post(URL, headers=HEAD, json=FLT, timeout=60)
if r.status_code in (429, 503):
    time.sleep(float(r.headers.get("Retry-After") or r.json().get("retry_after_seconds") or 2))
    r = requests.post(URL, headers=HEAD, json=FLT, timeout=60)
r.raise_for_status()

f = r.json()["freshness"]
print(f["count"], f["median_days_live"], f["pct_over_60_days"], f["pct_last_7_days"])
# 13125 155 71.2 5.1

Swap hireology for teamtailor, ashby, breezy, greenhouse, workable, lever, recruitee, smartrecruiters or personio to get the other rows. The free plan covers 5 insights calls a month, which is enough to check two systems and verify the table yourself; the numbers move slowly, so a re-run next week should land close.

freshness.count is the denominator — rows with a parsed date, not deduplicated postings — and it is always smaller than headline.row_count. Workable shows why the distinction matters: 170,393 rows carry a date while headline.job_count is 111,174. Any comparison that skips that distinction is comparing different things.

Get a free key — 200 postings and 5 insights calls a month, no card.