Greenhouse Jobs Scraper: Whole Boards, Descriptions Included
Pricing
from $2.10 / 1,000 job posting returneds
Greenhouse Jobs Scraper: Whole Boards, Descriptions Included
Scrapes job postings from any Greenhouse job board through Greenhouse's public API. One request returns an entire board with full descriptions, departments and real posted dates. Incremental mode ignores Greenhouse's bulk updated_at restamps, so you are not re-billed for rows that did not change.
Pricing
from $2.10 / 1,000 job posting returneds
Rating
0.0
(0)
Developer
First Party Data
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Job postings from any Greenhouse board (job-boards.greenhouse.io/...) through
Greenhouse's own public API. No login, no proxy, no browser.
| You give it | Greenhouse board URLs, company names like stripe, or nothing: switch on Search the built-in company list and filter 5,011 live Greenhouse boards |
| You get back | one row per posting: title, company, department, office, the full description, the date it was first published and the employer's own apply link |
| It costs | $3.50 per 1,000 rows on Apify's Free and Starter plans, $2.80 on Scale, $2.10 on Business and above, plus $0.01 per run. Filters are applied before you are charged, and a run that finds nothing costs nothing |
| The form as it opens | reads Stripe and Anduril Industries, 10 postings each: 20 rows, 8 cents on the Free plan, under 10 seconds on Apify. For more, raise Maximum jobs from any one job board and Maximum jobs to return |
Greenhouse publishes no pay field, no remote field and no country field. What that means for each filter is set out under "What Greenhouse does not publish" below, before you rely on one.
Greenhouse is among the cheapest applicant tracking systems to read, and the easiest one to build a broken feed on. Both come from the same place, and both are measured below rather than asserted.
One request returns the whole board, descriptions and all
Four of the thirteen systems this project reads publish a description only on a
per-posting detail endpoint: Workday, SmartRecruiters, BambooHR and Rippling. On
Workday that is one extra request for every posting on the board. Greenhouse is
not one of those four. It hands back the entire board in a single response, and
?content=true brings the description along at no extra request.
Measured across 150 boards sampled across the size range and 9,323 live postings (15 September 2026):
| Boards returned complete in one request | 150 of 150 |
| Postings carrying a real description | 100% |
| Postings carrying a department | 99.8% |
| Postings carrying an office | 99.1% |
| Postings carrying a real first-published date | 99.9% |
That is why this actor leaves includeDescriptions on by default here, where the
combined listing warns about the cost. On Greenhouse the description is free.
What that means in practice, measured on Apify against the largest board in the bundled list: 4,980 postings with full descriptions, in 6.6 seconds. One request. The same 4,980 postings on a system that publishes descriptions only on a detail endpoint would be 4,981.
updated_at is not a change signal, and a feed built on it bills you twice
This is the thing worth knowing before you build anything on Greenhouse.
Every posting carries updated_at, and it is the obvious field to hash if you
want to deliver only what changed since yesterday. On Greenhouse it moves across
a whole board at once, without the postings changing. An employer runs a bulk
edit, or Greenhouse touches the board, and every row is restamped within the same
hour.
Of the 47 sampled boards carrying 20 or more postings, 7 had one hour covering 90% or more of their postings: 14.9%. Some examples from that sample:
4,980 postings all stamped 2026-09-01 14:00 Svetness Personal Training241 postings all stamped 2026-09-14 15:00 Wolt116 postings all stamped 2026-09-10 17:00 Fin75 postings all stamped 2026-09-11 13:00 Theoria Medical
A normal board looks nothing like that: the median board in the sample spreads its postings across 18 distinct update hours.
Read the board count, not the posting count. Those 7 boards carry 64.5% of the sampled postings, and that figure is worthless: 4,980 of the 5,539 are one franchise board. The honest number is the board-weighted one, 14.9%.
So onlyNewOrChanged here deliberately does not watch updated_at. It
fingerprints title, location, pay, work arrangement, department, the posted
date and description length. A real edit still shows up, because a real edit
moves one of those. A bulk restamp does not, so you are not charged for 4,980
rows that are identical to yesterday's.
Set Maximum jobs from any one job board to 0 for a feed. The form opens at 10 per company to keep a first look cheap, and a limit left in place caps what every run can deliver from each company.
Coverage, published so you can check it before paying
This actor ships 5,011 verified live Greenhouse boards carrying
178,005 open postings, and 4,988 of them carry the employer's own
display name. Greenhouse puts company_name on every posting, so the coverage
list is a list of companies rather than a list of slugs.
The ten largest Greenhouse boards in the bundled list
- Svetness Personal Training: 4,980 roles
- EōS Fitness: 2,704 roles
- Pulse Healthcare: 2,670 roles
- BAYADA Home Health Care: 2,573 roles
- SpaceX: 2,444 roles
- Anduril Industries: 2,284 roles
- Carvana: 1,743 roles
- Centria Autism: 1,227 roles
- Upstream Rehabilitation: 1,210 roles
- Private Equity Insights: 1,152 roles
Every board was verified live at build time (2026-09-24): it answered Greenhouse's API with at least one open posting. Dead and private boards are not shipped.
Input
Paste board URLs, or just name the company:
https://job-boards.greenhouse.io/stripehttps://boards.greenhouse.io/andurilstripe
The board identifier is the last path segment, and both the old
boards.greenhouse.io and the current job-boards.greenhouse.io forms are
accepted. companyToken always holds the exact, unmodified identifier.
Or switch on Search the built-in company list to read the bundled boards, largest employers first.
What a row looks like
{"id": "greenhouse:stripe:8172487","sourceId": "8172487","requisitionId": "See Opening ID","title": "Abuse Investigator","company": "Stripe","companyToken": "stripe","department": "8611 Security Analytics","departments": ["8611 Security Analytics"],"locationRaw": "Dublin","locations": ["Dublin", "Ireland Locations"],"country": null,"countryInferred": false,"workplaceType": null,"compensation": null,"postedAt": "2026-09-03T17:30:34.000Z","updatedAt": "2026-09-12T17:25:25.000Z","descriptionText": "Who we are\n\nAbout Stripe\n\nStripe is a financial …","applyUrl": "https://stripe.com/jobs/search?gh_jid=8172487","boardUrl": "https://job-boards.greenhouse.io/stripe","ats": "greenhouse"}
Note postedAt and updatedAt on that row: nine days apart. postedAt
comes from Greenhouse's first_published and is the one you want. The nulls
are not missing data, they are Greenhouse. See below.
What Greenhouse does not publish, stated plainly
The four fields below are empty on Greenhouse rows because Greenhouse has no field for them, not because this actor failed to read one. Nothing here guesses: a wrong value behind a paid filter is worse than an empty one.
- No structured pay range, anywhere. Greenhouse returned one on 0 of the
9,323 postings sampled. What this actor does instead is read a range out of
the description prose when an employer wrote one there: 26.4% and 29.3% of
rows across two samples (4,000 rows from 99 companies, and 6,000 from 399).
That only works with
includeDescriptionson. With descriptions off it is zero, sowithSalaryOnlyand descriptions-off cannot be combined here. - No remote or hybrid field, so
workplaceTypesmatches nothing: 0.0% on both samples. Greenhouse never says whether a role is Remote, Hybrid or OnSite.remoteOnlydoes work, because it reads a different field:isRemoteis derived from the location, the title and the description, and comes out true on 10.3% of rows. Use that, notworkplaceTypes. The two are separate on purpose, and this is the one place on Greenhouse where this actor reads something rather than passing through a null: a remote flag is cheap to be wrong about, a country behind a paid filter is not. - No country field. Location is prose:
"Dublin","San Francisco","Remote - US".inferCountryresolves 80.9% and 77.6% of it across those same two samples and marks every such rowcountryInferred: true. A country filter therefore misses about a fifth of Greenhouse rows, and that is a floor on what any Greenhouse product can do rather than a limitation of this one. - No employment type. Full-time against contract is not in the API. 0.0% on both samples.
Both samples cap each company at 15 or 40 rows on purpose, and the two figures are given rather than averaged. A single large employer will otherwise decide a Greenhouse percentage on its own: two earlier uncapped runs measured country coverage at 77% and at 10%, and the second was 92% one gym chain whose locations are internal store codes. Any single Greenhouse percentage you read anywhere, including here, is a property of its sample.
Honest limits
- Greenhouse sits behind a CloudFront WAF. It will
403a client it decides is a crawler, and it blocked this project's own IP for about twenty minutes during corpus building. A403is reported in its own bucket asboardsForbidden, never as "board not found", because a blocked source and a closed board need opposite responses. Keepconcurrencyat its default unless you have a reason. departmentis whatever the employer typed. Stripe files a role under8611 Security Analytics. There is no shared taxonomy across boards and this actor does not invent one.- A board can be large. The biggest in the bundled list carries 4,980
postings and arrives in one response. Set
maxItemsif you are sampling. - Boards disappear. Companies switch ATS constantly. Those return 404, are
counted in
RUN_SUMMARY.boardsNotFound, and do not fail the run. - This reads what Greenhouse publishes and nothing else. Public board data only. Nothing authenticates, and no candidate data is touched.
Billing
Per job row returned, plus a small fee per run that delivers something. Rows
excluded by a filter are never charged, and in incremental mode unchanged
postings are not charged either, which on this platform is the whole point of the updated_at
section above.
Greenhouse is a trademark of Greenhouse Software, Inc. This actor is not affiliated with or endorsed by them. It reads the public job-board API that Greenhouse provides so that an employer's own postings can be republished.