Greenhouse Jobs Scraper & API - Open Roles, Any Company avatar

Greenhouse Jobs Scraper & API - Open Roles, Any Company

Pricing

from $1.20 / 1,000 jobs

Go to Apify Store
Greenhouse Jobs Scraper & API - Open Roles, Any Company

Greenhouse Jobs Scraper & API - Open Roles, Any Company

Track hiring across up to 200 Greenhouse boards in one run, in one row shape you can diff daily. Zero open roles, a board that does not exist and a failed fetch are three different rows - never a silently empty result. Unofficial, not affiliated with Greenhouse.

Pricing

from $1.20 / 1,000 jobs

Rating

0.0

(0)

Developer

NeverEmpty

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

9 hours ago

Last modified

Share

Pull every open job from any company's Greenhouse job board, read straight from Greenhouse's own public board API. No HTML scraping, no proxies, no API keys, nothing that breaks when a careers page is redesigned.

Unofficial. This Actor is not affiliated with, endorsed by, or sponsored by Greenhouse. All product names are trademarks of their respective owners.

Don't know a company's board name? ATS Job Board Finder turns a domain into the board name this Actor takes.


It never returns an empty result to mean two different things

Most job-board Actors return an empty dataset when something goes wrong, and an empty dataset when there is genuinely nothing to report. Those are not the same answer, and if you are monitoring hiring activity the difference is the whole point.

Every board you ask for produces at least one row, tagged in the rowType column:

rowTypeokWhat it meansCharged?
jobtrueA real open jobYes
no-open-rolestrueThe board is live and has no open jobs (or none matching your filters)No
board-not-foundfalseNo board with that name exists on GreenhouseNo
unavailablefalseGreenhouse could not be reached, or the entry could not be read as a board; reason says whyNo
budget-reachedfalseThe run hit the Max total charge you set. Names every board that was cut short and every board not fetched because of itNo

You are charged only for job rows.


What Greenhouse actually publishes - measured, not estimated

Run on 2026-09-01 with the shipped build and the default input: 1000 job rows across 2 boards.

stripe (568)databricks (432)
title, jobUrl, postedAt, department100%100%
employmentType, workplaceType, isRemote0%0%
salaryMin / salaryMax0%0%

Greenhouse's public board API does not carry employment type, workplace type or salary at all, so those stay null rather than being guessed. remoteOnly therefore never matches a Greenhouse board - use remoteHint if you want the guess. department is filled by reading Greenhouse's /departments endpoint, which is why it is populated even without descriptions.


Input

FieldTypeDefaultWhat it does
boardsarraygreenhouse:stripe, greenhouse:databricks, greenhouse:anthropicOne entry per company board, up to 200
titleContainsstring(empty)Keep only jobs whose title contains this text (case-insensitive)
departmentContainsstring(empty)Keep only jobs whose department or team contains this text
locationContainsstring(empty)Matches the primary location and every secondary location
remoteOnlybooleanfalseKeep only jobs Greenhouse itself flags as remote - never a guess
postedWithinDaysinteger0 (off)Keep only jobs first published within N days. Unknown dates are excluded rather than assumed recent
maxJobsPerBoardinteger0 (no limit)Cap of job rows per board, applied after filtering
includeDescriptionbooleanfalseAdd the full description as plain text in descriptionText
maxRetriesinteger3Total attempts per board for temporary errors (HTTP 429 / 5xx). A 404 is a permanent answer and is not retried

Naming a board: greenhouse:stripe, or paste https://boards.greenhouse.io/stripe, or just stripe


Output columns

rowType, ok, reason, ats, companySlug, companyName, jobId, title, department, team, employmentType, locationRaw, locationsAll, country, city, workplaceType, isRemote, remoteHint, salaryMin, salaryMax, salaryCurrency, salaryInterval, salaryText, postedAt, updatedAt, jobUrl, applyUrl, descriptionText, source

All 29 columns are present on every row, in the same order - including the marker rows. The Greenhouse, Lever, Ashby, Workable and Workday Actors all return these same 29 columns, so adding another ATS never means rewriting your parser.

Two things it refuses to invent

  • isRemote is set only when Greenhouse itself says so. A guess based on the location text lives in a separate column called remoteHint, so you always know which is which. A job located in "Remote, Oregon" is not a remote job.
  • salaryMin / salaryMax come only from structured compensation fields. Nothing is parsed out of prose, and a missing figure stays null - never 0.

How it is checked

  • 148 automated checks across 3 files, run before every publish
  • 50 deliberate defects injected into the source; all 50 were caught by those checks (re-run and verified 2026-09-03)
  • Only public job boards are read. Nothing needs a login, and no private ATS data is accessed
  • Every request has a 45-second timeout, so a silent server cannot hang the run
  • Up to 200 boards per run

The rest of the family

Same 29 columns, same row rules, one ATS each:

Support

Found a board that behaves oddly? Open an issue on the Issues tab and include the board name - it will be reproduced against the live API before anything is changed.