Companies that hire through Greenhouse post their openings on a hosted board, like GitLab's Greenhouse job board, and those postings are the closest thing to a live headcount signal you can get. Getting them out means one board at a time, HTML descriptions, pay buried in prose, and no list of who uses Greenhouse. I'll show the manual route and where it breaks, then the shortcut: the Greenhouse Job Board API on Apify, which returns live jobs from any Greenhouse board as JSON with no Harvest key, and finds the 4,400+ companies hiring there.
Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.
Does Greenhouse have an API for job postings?
Yes, two. The Harvest API is Greenhouse's private one for employers; no key for a company you don't work at. The Job Board API is public and read-only, documented on Greenhouse's developer site for integrators building application flows, and for one company, once, just call it. It serves one board per call, though, you need the token first, and Greenhouse publishes no list of boards. The Actor fills those gaps: a directory of 4,400+ verified boards, parsed salaries, Markdown, timestamp filters, and rows filtered before you pay.
What the Greenhouse job board API returns
The Greenhouse Job Board API returns one row per open job as structured JSON: title, company, departments, offices, location, remote flag, employer timestamps, raw and parsed salary, and a Markdown description.
| Field | Example | Notes |
|---|---|---|
title |
Account Executive - Italy |
Plus companyName, boardToken, id, url
|
location |
Remote, Italy |
With isRemote, departments, offices
|
dateUpdated |
2026-08-03T16:43:10-04:00 |
Employer's stamp; datePublished too |
salaryDerived |
{ "min": 71400, "max": 126000, "currency": "EUR" } |
Parsed; salaryRaw is verbatim |
Who this is for
Sales and GTM teams who read hiring as a buying signal; recruiters pulling every open role at target companies; talent analysts tracking posting velocity and pay transparency; and anyone handing live job data to an AI agent.
The manual way, and where it breaks
The DIY route is a script that calls the public endpoint per board token and diffs the JSON against last night's file. It works for three companies. At thirty you learn a token is not the company's name and start reading page source. Descriptions come back as HTML, the salary is a sentence inside it, and your regex misses the EUR postings. Your diff needs a database, and "every company on Greenhouse" has no endpoint at all. None of this is hard. All of it is maintenance, and you wanted a dataset.
The faster way: run the Greenhouse Job Board API
Apify Console
- Open the Greenhouse Job Board API and click Try for free.
- Put board tokens or board URLs in
companies; addtitleKeywordsorupdatedAfterfor a subset. - Run it and download the dataset as JSON, CSV, or Excel.
REST
curl -X POST "https://api.apify.com/v2/acts/johnvc~greenhouse-job-board-api/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "companies": ["gitlab", "stripe"], "titleKeywords": ["engineer"], "maxJobs": 10 }'
Endpoint reference: the Apify API docs.
Scrape Greenhouse job postings in Python
Call the Actor with apify-client and keep the rows whose resultType is job:
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("johnvc/greenhouse-job-board-api").call(
run_input={
"companies": ["gitlab", "stripe"],
"titleKeywords": ["engineer"],
"maxJobs": 10,
}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if row.get("resultType") != "job":
continue
salary = row.get("salaryDerived") or {}
print(row["title"], row["companyName"], row.get("location"), row["dateUpdated"])
print(" ", salary.get("min"), salary.get("max"), salary.get("currency"), row["url"])
Use the Greenhouse job board API without a key
Nothing to sign up for. The default run reads Stripe's board with Markdown on and maxJobs at 100; the task Use the Greenhouse Job Board API Without a Key is that configuration.
A job board scraper for Greenhouse career sites
Paste whatever you have, board tokens, board URLs, embed URLs, or single job URLs, mixed freely across companies and startUrls. outputMode: urlsOnly gives a cheap index: id, title, company, link, timestamps. The task is Job Board Scraper for Greenhouse Career Sites.
Greenhouse job postings with salary data
Published pay ranges pass through verbatim as salaryRaw; a deterministic parser adds salaryDerived (min, max, currency, period) from the posting text. See Greenhouse Job Postings With Salary Data.
Find companies using Greenhouse
There is no page that lists all Greenhouse open jobs, so the Actor ships one. outputMode: companiesOnly returns one row per company from the bundled directory, live-verified, with boardToken, boardUrl, and a current jobCount; dead boards are never billed. discoveryQuery text-matches company names and maxCompanies caps a blind sweep. This is the run I do first when I want to know who is quietly staffing up in a niche. Task: Find Companies Using Greenhouse ATS.
Track new Greenhouse jobs daily
Every job carries the employer's own published and updated stamps, so updatedAfter: "25h" on a daily schedule returns only what changed since yesterday, no seen-list needed; publishedAfter narrows that to new roles. One run is a snapshot. A scheduled run is a time series, and that shows a company opening twelve engineering roles before any press release. Task: Track New Greenhouse Job Postings Daily.
Greenhouse jobs as Markdown for AI agents
includeDescriptionMarkdown is on by default, so every row carries a Markdown description an LLM can read without an HTML-stripping step, with stable field names. Task: Greenhouse Jobs as Markdown for AI Agents.
Greenhouse MCP server for job data: Claude, Claude Code, and Cursor
Apify exposes the Actor over MCP, so Claude, Claude Code, Cursor, and ChatGPT get a greenhouse-job-board-api tool that answers "which of these twenty companies posted sales roles this week" with live data. The server URL is:
https://mcp.apify.com/?tools=actors,docs,johnvc/greenhouse-job-board-api
In Claude Code that is claude mcp add --transport http apify plus the URL; Claude Code has a free trial at claude.ai.
The example repo
johnisanerd
/
Apify-Greenhouse-Job-Board-API
greenhouse job board api: Python + MCP quick-start for the Greenhouse API on Apify. Call it from Python (uv) or as an MCP tool in Claude and Cursor. Returns structured JSON for greenhouse job board api.
🌱 Greenhouse Job Board API: live jobs, companies, and new postings
A Python and MCP quick-start for the Greenhouse job board API on Apify. Pull live jobs from any Greenhouse-hosted career site, discover companies hiring through Greenhouse, and track new or changed postings, all without a Harvest key or a login.
- Actor: Greenhouse Job Board API on Apify
- Input schema: input parameters
- Get a free API token: apify.com
Greenhouse is the applicant tracking system behind the career pages of thousands of companies, including Stripe, Airbnb, GitLab, and Anthropic. This Actor reads the public Greenhouse job board API live at run time, so every row reflects what the board says right now, not what an index remembered last week. Give it board tokens or URLs, or give it nothing and let it sweep a bundled directory of 4,400+ verified boards.
Text walkthrough
The Greenhouse job board API takes company board tokens…
A uv Python quick start with five --example recipes and MCP install guides for five clients.
FAQ about scraping Greenhouse job boards
Is the Greenhouse scraper free, or what does it cost?
Per delivered row: one event per job record, plus add-ons (description formats, application questions, run report) billed only on rows that carry them. No start fee, no minimum, and filtered rows are never charged; with add-ons off a job row costs a fraction of a cent. Prices are on the store's pricing card, and new Apify accounts include free platform credit.
Is job-boards.greenhouse.io legit, and is a scraper allowed to read it?
Yes, job-boards.greenhouse.io and boards.greenhouse.io are both official Greenhouse domains. The scraper reads only the public job board layer behind them, never applicant or Harvest data; whether your use of public job data is fine where you live (California comes up a lot) is a question for your counsel, not me.
Can Claude run this scraper over MCP, and is it Greenhouse's MCP?
Claude, Claude Code, Cursor, and ChatGPT can, through the hosted Apify MCP server URL above. It is not Greenhouse's own MCP product, which is built for Greenhouse customers; this one is public job data for anyone building an agent.
How do I schedule this scraper for a daily new-jobs feed?
Save your input as a task with updatedAfter at 25h, attach an Apify schedule with a cron expression like 0 7 * * *, and each run returns only jobs that changed since the last one. Start from the Greenhouse Job Board API.
Where does the Greenhouse scraper stop?
At the EU data silo: boards on job-boards.eu.greenhouse.io are detected and reported but not yet scraped (EU support is planned). Nothing behind the Harvest API: no applicants, no internal requisitions. A bad token comes back as an in-band error row with errorCode: board_not_found.
More from Truffle Pig Data
Hiring data rarely lives on one ATS, so three siblings: the Ashby Job Board API for Ashby-hosted boards, the Workday Careers API for Workday career sites, and the Google Jobs Scraper for Google Jobs.
Wrapping up
Greenhouse gives you one board at a time; the Actor gives you all of them, salaries parsed, yesterday's changes filtered. Try the Greenhouse Job Board API, or clone the example repo and run --example companies on your niche.

Top comments (0)