In due diligence the current job board is the least useful view of a target's hiring. It shows what is open today. The questions that matter are about change: did sales hiring stop two months before the process started, which roles have been reposted three times, and did the new region in the deck ever get a single requisition?
A job postings api for due diligence has to answer those questions, and you are given weeks, not a year of snapshots. Reading a target's live board as JSON is covered in the job postings post for consultants. This post covers the part that post says it cannot do: the history from before your first snapshot.
Where does a target's hiring history live?
Often in the Wayback Machine, which has frequently been capturing the board for years. Its CDX index lists every capture of a URL, and collapse=timestamp:6 keeps one per month:
curl -X POST https://crawlforge.dev/api/v1/tools/fetch_url \
-H "X-API-Key: cf_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"url": "https://web.archive.org/cdx/search/cdx?url=job-boards.greenhouse.io/target-co&output=json&fl=timestamp,statuscode&filter=statuscode:200&collapse=timestamp:6&from=2025"
}'That call costs 1 credit and returns rows like ["20250320221034","200"], one per month. For one Greenhouse board we checked, the HTML page had a capture in each of the last 20 months, while its JSON endpoint had three successful captures all year. Archive coverage differs by URL, so run the index on each address the board has had and use whichever is densest.
How do you read an archived board?
Add id_ after the timestamp. The archive then returns the original body without its replay toolbar:
{
"url": "https://web.archive.org/web/20250320221034id_/https://job-boards.greenhouse.io/target-co",
"max_inline_chars": 1000000
}Each capture costs 1 credit through fetch_url. An archived API capture is the board's JSON as it was served that day. An archived Greenhouse HTML page embeds its roles as data too, each with published_at, updated_at and requisition_id. Raise max_inline_chars, because the HTML capture we checked was about 550 KB, far over the 40,000-character default.
What should the diff tell you?
Key every capture on requisition_id rather than job id, where the company fills it in. One requisition is often posted in several cities, each with its own job id, so counting postings overstates hiring. Then line the months up:
| Pattern across captures | Question for management |
|---|---|
| Sales or engineering requisitions fall away in the months before the process | Was there a hiring freeze, and why? |
| The same requisition reposted under new job ids | Has the role been hard to fill, or filled more than once? |
| A role open since the first capture | Is the role still funded, or left open as an evergreen listing? |
| The expansion region in the deck has no requisitions | When does the expansion get headcount? |
| A leadership role appears, disappears and reappears | Who left, and who is covering the job? |
Comparing the current count of sales roles with the deck is a different check, covered in the commercial diligence post.
What does it cost?
One CDX call, twelve monthly captures and the live board come to 14 credits a target. Adding five comparables makes it 84 credits, about 25 cents at $3 per thousand. A new account's one-time allowance stretches to roughly 70 targets.
Where does a job postings API for due diligence fall short?
- Gaps are the archive's, not yours to fill. A board nobody captured has no history, and a month with no capture is a blank, not a zero.
- Postings are not headcount. A requisition says a role was budgeted, not that anyone was hired or that the role was real.
- The HTML may hold one page. The capture we checked embedded 50 roles; a larger board may need its API capture instead.
- Public captures only. Nothing here reaches the CIM or management accounts. The archive's own
robots.txtis honoured like any site's, and a refused fetch is not charged.
Create a free account and pull the last year of your current target's board before the management meeting. Every parameter is in the fetch_