Greenhouse Jobs Scraper: Whole Boards, Descriptions Included avatar

Greenhouse Jobs Scraper: Whole Boards, Descriptions Included

Pricing

from $2.10 / 1,000 job posting returneds

Go to Apify Store
Greenhouse Jobs Scraper: Whole Boards, Descriptions Included

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

First Party Data

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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 itGreenhouse 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 backone 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 opensreads 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 request150 of 150
Postings carrying a real description100%
Postings carrying a department99.8%
Postings carrying an office99.1%
Postings carrying a real first-published date99.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 Training
241 postings all stamped 2026-09-14 15:00 Wolt
116 postings all stamped 2026-09-10 17:00 Fin
75 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

  1. Svetness Personal Training: 4,980 roles
  2. EōS Fitness: 2,704 roles
  3. Pulse Healthcare: 2,670 roles
  4. BAYADA Home Health Care: 2,573 roles
  5. SpaceX: 2,444 roles
  6. Anduril Industries: 2,284 roles
  7. Carvana: 1,743 roles
  8. Centria Autism: 1,227 roles
  9. Upstream Rehabilitation: 1,210 roles
  10. 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/stripe
https://boards.greenhouse.io/anduril
stripe

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 includeDescriptions on. With descriptions off it is zero, so withSalaryOnly and descriptions-off cannot be combined here.
  • No remote or hybrid field, so workplaceTypes matches nothing: 0.0% on both samples. Greenhouse never says whether a role is Remote, Hybrid or OnSite. remoteOnly does work, because it reads a different field: isRemote is derived from the location, the title and the description, and comes out true on 10.3% of rows. Use that, not workplaceTypes. 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". inferCountry resolves 80.9% and 77.6% of it across those same two samples and marks every such row countryInferred: 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 403 a client it decides is a crawler, and it blocked this project's own IP for about twenty minutes during corpus building. A 403 is reported in its own bucket as boardsForbidden, never as "board not found", because a blocked source and a closed board need opposite responses. Keep concurrency at its default unless you have a reason.
  • department is whatever the employer typed. Stripe files a role under 8611 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 maxItems if 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.