Greenhouse Job Board Scraper avatar

Greenhouse Job Board Scraper

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Greenhouse Job Board Scraper

Greenhouse Job Board Scraper

Collect every open job posting from any Greenhouse-hosted job board in one request.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

String

String

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Greenhouse Job Board Scraper — a whole board in one request

Collect every open job posting from any Greenhouse-hosted job board. Give this Actor a Greenhouse board URL or a company board token, and it returns the whole board with title, company, department, location, remote flag, posted date and apply URL.

Greenhouse publishes every board as JSON, so this Actor reads that board feed rather than the rendered careers page. One request returns an entire Greenhouse board — a measured run collected 814 postings from 1.23 requests.

No Greenhouse account, login, API key or cookies are used. This Actor reads the public Greenhouse board that a logged-out visitor sees.

What it returns

FieldTypeNotes
jobIdstringGreenhouse's own posting ID — stable, use it to de-duplicate
titlestring
companystringThe company name Greenhouse publishes on the board
tenantstringThe Greenhouse board token, e.g. databricks
locationstringExactly as the recruiter wrote it on the posting
city, state, countrystringSplit out only when the location is unambiguously one place. null for a list or a qualifier such as Dublin OR London or Remote - US, where location still carries the original
isRemotebooleantrue when the location names remote or work from home
departmentstringThe Greenhouse department the posting is filed under; null when it is filed under none
employmentTypestringFrom the board's own metadata field where the company publishes one, e.g. "Full-time"; null otherwise
postedAtstringISO 8601 timestamp — the posting's first_published, falling back to updated_at
jobUrlstringDirect link to the posting. Greenhouse may point this at the company's own careers page
boardUrlstringThe board a person would open, https://job-boards.greenhouse.io/<tenant>
sourceUrl, collectedAtstringProvenance for every row

Input

{ "boards": ["https://job-boards.greenhouse.io/databricks", "stripe"], "maxItems": 1000 }
FieldDescription
boardsGreenhouse board URLs or company board tokens. Required, 1–100.
maxItemsCap on dataset items. Default 1000, maximum 50,000. Free plans stop at 250 requests and 250 results — see below.
concurrencyBoards fetched in parallel. Default 5, maximum 10.

A board token, a board URL, a deep posting URL such as /databricks/jobs/8559344002, and an embedded board URL carrying ?for=databricks all resolve to the same Greenhouse board and are fetched once rather than billed three times.

Use cases

  • Tracking which companies are hiring, and for which departments, across a watchlist of Greenhouse boards
  • Competitor hiring signals — headcount direction by team, read from the board itself rather than an aggregator
  • Filling an ATS, job board or talent CRM with live postings straight from the employer
  • Recruiting lead lists by department, location or remote status
  • Monitoring a board over time by re-running on a schedule and diffing on jobId

Reliability

Greenhouse's board feed is structured JSON published by Greenhouse itself, so there is no markup contract to break and no model in the path: a field is either present on the posting or absent.

An empty board is treated as a real result, not a failure — a company between hiring rounds genuinely has no postings. An unknown board token is reported as a failure, because Greenhouse answers it with {"error":"Invalid Board Token"}.

A board that cannot be read is recorded in the run's SUMMARY under failures rather than silently returning fewer rows, and a run where every board failed exits with an error.

Frequently asked questions

How do I find a company's Greenhouse board URL? A Greenhouse board lives at https://job-boards.greenhouse.io/<token>, where the token is the company's own slug — databricks, stripe. If the company embeds its board in its careers page, the token is the for= parameter on the embedded board URL. You can pass the full URL or just the token.

Do I need a Greenhouse account, API key or login? No. This Actor reads the public Greenhouse board feed that any logged-out visitor can see. No account, no cookies, no session.

How many job postings does one request return? One request returns the entire Greenhouse board. A measured run collected 814 postings from 1.23 requests, so a large board costs the same single fetch as a small one.

Does it work for any company on Greenhouse? Yes — any board hosted on Greenhouse, addressed by its board token. Nothing is hardcoded per company.

Can I get the full job description text? No. This Actor returns the board's posting fields listed above; follow jobUrl for the full description. The description is deliberately excluded because requesting it inflates one board's response from 0.7MB to 7.5MB.

Why are city, state and country sometimes empty? Greenhouse does not model a location — location is free text a recruiter typed. Values are only split when the string is unambiguously one place, so Cork, Ireland; Dublin, Ireland and Dublin OR London are left unsplit rather than guessed at. The verbatim string is always in location.

Limitations

Board fields only: no job description body, no salary or compensation, no application counts and no recruiter contacts. employmentType exists only where the company publishes it as board metadata, so it is null on many boards. Only greenhouse.io boards are accepted — a URL on any other host is rejected rather than fetched.

Free plan limit

Runs started from an Apify free plan stop at 250 requests and 250 results, and the run reports that it reached the limit. Any paid plan runs the full input and maxItems you set.

The limit exists because this Actor fetches through our own infrastructure, which Apify does not cover for free-plan runs. It binds on requests as well as results so that a large input list cannot spend those fetches for rows the run will not return.